我正在尝试理解继承应用程序中的测试,我需要一些帮助。
有很多像这样的规范组(查看规范):
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 变量,而我正在重构它)。
现在,在我看来,使用块expect
内部before
是错误的。让我们暂时忘记这一点。
通常上面的测试是绿色的。
但是,如果我删除该expect
行,测试将失败。在这种情况下,似乎是在expect
视图上存根方法。实际上,替换expect
为allow
似乎具有完全相同的效果。
我认为正在发生的事情通常是——当与服务器一起运行时——视图将调用job_posts
并且消息将落在控制器上的辅助方法上,这是预期的行为。
然而,这里expect
是设置一个期望值,同时在 stub 上view
使用一个固定返回值的方法。由于视图模板将调用该方法,因此测试通过。
关于意外的“存根”副作用expect
,我在rspec-mocks 自述文件中发现了这一点:
(...) 我们还可以设置一个消息期望,以便在未调用 find 时示例失败:
person = double("person") expect(Person).to receive(:find) { person }
RSpec用它自己的类似 test-double 的方法替换了我们正在存根或模拟的方法。在示例结束时,RSpec 验证任何消息期望,然后恢复原始方法。
有没有人对该方法的这种特定使用有任何经验?