- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试编写一个规范,该规范期望在一个范围内的所有实例上调用一个方法。找不到优雅的方式来做到这一点。
这是我的代码的简化表示:
class MyClass < ActiveRecord::Base
scope :active, where(:status => 'active')
scope :inactive, where(:status => 'inactive')
def some_action
# some code
end
这个类被另一个调用 MyClass.all
上的 some_action
的类使用:
class OtherClass
def other_method
MyClass.all.each do |item|
item.some_action
end
end
我想把它改成:
class OtherClass
def other_method
MyClass.active.each do |item|
item.some_action
end
end
为了测试这种行为,我可以简单地MyClass.stub(:active)
,返回一个 stub 数组,并在每个 stub 上期望some_action
。但我不喜欢这种方法,因为它暴露了太多的实现细节。
我觉得更优雅一点的是 any_instance_in_scope
。然后我可以简单地将我的规范写成:
MyClass.any_instance_in_scope(:active).should_receive(:some_action)
有什么办法可以实现吗?
最佳答案
首先,MyClass.all.some_action
不会起作用,因为 MyClass#some_action
是一个实例方法,同时 MyClass#all
返回一个 Array
- 所以当您执行 MyClass.all.some_action
时,您实际上是在调用 Array#some_action
。
另外,请注意 MyClass.all
和 MyClass.active
返回不同的类:
MyClass.active.class # => ActiveRecord::Relation
MyClass.active.all.class # => Array
我不确定你的 some_action
应该做什么......我想你可能想要做的一些选择:
如果 some_action
正在过滤数组,您应该将其转换为另一个作用域,执行如下操作:
class MyClass < ActiveRecord::Base
scope :active, where(:status => 'active')
scope :inactive, where(:status => 'inactive')
scope :some_action, ->(color_name) { where(color: color_name) }
end
然后使用 MyClass.active.some_action('red').all
调用它。如果您只想要第一个结果,MyClass.active.some_action('red').first
。
scope
这是一个很好的答案(以及原因):Testing named scopes with RSpec .
假设您确实希望将 MyClass#some_action
定义为实例方法。然后,您可以尝试这样做:
class MyClass < ActiveRecord::Base
scope :active, where(status: 'active')
scope :inactive, where(status: 'inactive')
def some_action
self.foo = 'bar'
self
end
end
在这种情况下,您可以使用 MyClass.active.last.some_action
执行它,因为 #last
将返回一个实例,而不是整个数组。
some_action
我相信你应该简单地用期望来测试它:
MyClass.should_receive(:some_action).at_least(:once)
MyClass.active.last.some_action
对此的补充讨论:How to say any_instance should_receive any number of times in RSpec
假设您真的想运行 MyClass.active.some_action
。我建议您首先尝试这个(与选项 #2 相同的示例):
class MyClass < ActiveRecord::Base
scope :active, where(status: 'active')
scope :inactive, where(status: 'inactive')
def some_action
self.foo = 'bar'
self
end
end
然后用 MyClass.active.all.map{|my_class| 运行my_class.some_action
.
现在,如果您真的想要实现MyClass.active.some_action
——您希望some_action
在ActiveRecord的所有实例上执行::Relation(我不推荐),这样做:
class MyClass < ActiveRecord::Base
scope :active, where(status: 'active')
scope :inactive, where(status: 'inactive')
def some_action
# really do it
end
end
还有……
class ActiveRecord::Relation
# run some_action over all instances
def some_action
to_a.each {|object| object.some_action }.tap { reset }
end
end
同样,我不建议这样做。
some_action
与选项 #2 相同的情况:
MyClass.should_receive(:some_action).at_least(:once)
MyClass.active.last.some_action
注意:所有代码均使用 Ruby 2.0.0-p0。安装并使用它,它的乐趣! :-)
关于ruby-on-rails - 如何使用 RSpec 在范围内模拟 any_instance?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15374749/
我有一个类,在一种情况下应该调用:my_method,但在另一种情况下不能调用方法:my_method。我想测试这两种情况。另外,我希望测试记录不应调用 :my_method 的情况。 Using a
现在我有很多: it{ ::Api.any_instance.should_receive(...).once; start } 如果我试图让 ::Api.any_instance 成为主题,Rspe
我有这样的代码: @dns = "#{params[:domain].split('/').reverse.join('.')}.#{params[:zone]}" w = Whois::Client
我正在尝试 stub 某个类的任何实例。我需要 stub fetch 方法,它用一些数据填充 self。 如何访问 self 变量,修改它并返回 fetch 方法? MyObject.any_inst
这个问题不太可能对任何 future 的访客有帮助;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于互联网的全局受众。如需帮助使这个问题更广泛适用,visit the h
如何在不使用 Mocha 的 any_instance 的情况下执行以下操作?我只想将 protected Controller 测试为 described here不使用 Rspec。 class
我正在尝试编写一个规范,该规范期望在一个范围内的所有实例上调用一个方法。找不到优雅的方式来做到这一点。 这是我的代码的简化表示: class MyClass 'active') scope :ina
我正在尝试为该类的任何实例(通过 any_instance) stub 一个类方法。我的测试成功运行,但在测试结束时,当 rspec 尝试重置 any_instance stub 时,它会抛出错误(无
我需要对具有特定属性或属性集的模型的所有实例进行 stub 。例如,使用 ActiveRecord: let(:model1) { Model.create!(uid: 1) } let(:model
在我的 Rails 项目中,我使用 rspec-mocks 和 any_instance 但我想避免这个弃用消息: 使用 rspec-mocks 的旧 :should 语法中的 any_instanc
以下代码按预期工作: Object.any_instance.should_receive(:subscribe) 但是当使用新的 rspec 期望时它不起作用: expect(Object.any_
我在 Rails 中有一个导入 Controller ,可以将多个包含多条记录的 csv 文件导入我的数据库。我想在 RSpec 中测试记录是否实际上是通过使用 RSpec 保存的: .any_ins
例如,我有 A 类。 class A end 并希望在规范中从 stub 方法返回该类的实例。 A.any_instance.stub(:my_method).and_return() 是否有可能在
我想在 rspec 测试中使用 Mocks。 klass.any_instance.should_receive(:save).exactly(2).times.and_return(true) 但我
通常在我的 Rails Controller 测试中,我会在 { Website.any_instance.stub(:save).and_return(false) } 之前执行 来测试记录未保存时
尝试对 Fog::Compute 对象的方法进行 stub ,如下所示: describe EtHaproxy::Helpers do let(:helpers) { Object.new.ext
Feature: test randomness In order to make some code testable As a developer I want Array
很像this question ,我也在使用 Ryan Bates 的 nifty_scaffold。它具有使用 Mocha 的 any_instance 的理想方面。在 Controller 后面的
我只想 stub 一个特定模型,但不是一个特定对象,不是每个实例 例如给定具有属性“name”(字符串)和“cool”( bool 值)的类“Person”。我们有两种模型: person_bill:
这是我正在测试的包含在 Foo.rb 中的类: class Foo def bar return 2 end end 这是 Foo_spec.rb 中包含的我的测试:
我是一名优秀的程序员,十分优秀!