【发布时间】:2014-05-05 11:42:55
【问题描述】:
我正在尝试理解继承应用程序中的测试,我需要一些帮助。
有很多这样的规范组(查看规范):
let(:job_post) { FactoryGirl.create(:job_post) }
# ...
before do
expect(view).to receive(:job_post).at_least(:once).and_return(job_post)
end
it "should render without error" do
render
end
... job_post 是控制器上定义的辅助方法。 (是的,他们本可以使用@instance 变量,而我正在重构它)。
现在,我认为在 before 块内使用 expect 是错误的。让我们暂时忘记这一点。
上面的测试通常是绿色的。
但是,如果我删除 expect 行,测试将失败。在这种情况下,expect 似乎在视图上存根方法。其实把expect换成allow好像效果完全一样。
我认为发生的情况是正常情况下 - 当与服务器一起运行时 - 视图将调用 job_posts 并且消息将登陆控制器上的辅助方法,这是预期的行为。
然而,expect 设置了一个期望值,同时在view 上使用一个固定的返回值存根方法。由于视图模板将调用该方法,因此测试通过。
关于expect 的意外“存根”副作用,我在rspec-mocks readme 中找到了这个:
(...) 我们也可以设置一个消息期望,这样如果 find 没有被调用,例子就会失败:
person = double("person") expect(Person).to receive(:find) { person }RSpec 用它自己的类似 test-double 的方法替换我们存根或模拟的方法。在示例结束时,RSpec 会验证任何消息预期,然后恢复原始方法。
有人对该方法的这种特定使用有任何经验吗?
【问题讨论】:
标签: ruby-on-rails ruby rspec rspec-mocks