我正在尝试设置控制器测试以确认我的一个实例变量(@template
)收到给定的函数调用(deliver
)。
但是,使用以下代码,assigns
会在posts
之前进行评估,因此assigns
为nil
:
it 'calls @template.deliver' do
assigns(:template).should_receive(:deliver).and_call_original
post :deliver, params
end
如何有效地设置此测试?
技术堆栈:
Ruby 1.9.3p448
Rails 3.2.13
rspec-rails 2.13.1(对于下面接受的答案,我必须升级到2.14)
答案 0 :(得分:1)
假设@template
是Template
对象的实例,您可以使用rspecs expect语法:
it 'calls @template.deliver' do
Template.any_instance.stub(deliver: true)
post :deliver, params
expect(assigns(:template)).to have_received(:deliver)
end
答案 1 :(得分:0)
最简单的似乎是先创建模板对象,然后将Template.find方法存根以返回您创建的对象,例如(在我的例子中使用mocha)
@template = ...
Template.stubs(:find).returns(@template)
然后,您可以使用您所写的语句
@template.should_receive(:deliver).and_call_original
答案 2 :(得分:0)
我能想到的一种方法是对分配模板的部分进行简化
例如(假设您对get_template进行了单独的测试):
如果您有以下投放操作
def deliver
@template = get_template
@template.deliver
end
你的考试可以
it 'calls @template.deliver' do
controller.should_receive(:get_template).and_return(mock_template = mock("template"))
mock_template.should_receive(:deliver).and_call_original
post :deliver, params
end