如何在 Rails 3 中存根 find_each 进行 rspec 测试
我想知道如何在 rspec 中测试 find_each 调用。我习惯于简单地存根我希望模型返回的内容,因此我不依赖数据库中的测试数据,如下所示:
MyClass.stub(:find).and_return(my_mock)
中我正在这样做:
MyClass.find_each do |instance_of_my_class|
do_stuff_here_on(instance_of_my_class)
end
我发现如果我这样做:
MyClass.stub(:find_each).and_return([one_mock, two_mock])
但是,在另一个类 规范测试时,“在这里做事”部分没有被执行。有谁知道如何存根 find_each 进行 rspec 测试?
I was wondering how to test a find_each call in rspec. I'm used to simply stubbing what I want my models to return so I don't rely on test data in the db like this:
MyClass.stub(:find).and_return(my_mock)
However, in another class I'm doing this:
MyClass.find_each do |instance_of_my_class|
do_stuff_here_on(instance_of_my_class)
end
I find that if I do this:
MyClass.stub(:find_each).and_return([one_mock, two_mock])
in the spec test, the "do stuff here" part is not being executed. Does anyone know how to stub a find_each for rspec testing?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您可以使用 and_yield 使 rspec 调用传递给模拟的块:
You can use and_yield to make rspec call the block passed to the mock:
如果您需要在已验证的双精度上存根
find_each
并让它循环遍历特定的值数组,您可以这样做:If you need to stub
find_each
on a verified double and have it loop through a specific array of values, you can do this:存根方法的全部目的是让该方法返回预期值而不执行其内容。如果 find_each 方法中有一堆逻辑,我建议将其移至单独的方法并单独测试该逻辑。然后您可以测试您的方法在执行期间是否被调用。
这是一个非常高级的示例:
Rspec:
The whole point of stubbing a method is so that the method returns an expected value and not execute its contents. If you have a bunch of logic within the find_each method, I would recommend moving it to a separate method and testing that logic separately. You can then test that your method is called during execution.
Here's a pretty high level example:
Rspec:
这应该可以做到:
如果 do_stuff_here_on 不可全局访问,例如 some_object 上的实例方法,您将需要一些 instance_eval 来获取该块的正确范围:
This should do it:
If do_stuff_here_on isn't globally reachable, e.g. an instance method on some_object, you'll need some instance_eval to get the right scope for the block: