在控制器测试中分配(:var).should_receive(:方法)

时间:2014-02-14 18:32:31

标签: ruby-on-rails ruby-on-rails-3 rspec rspec2

我正在尝试设置控制器测试以确认我的一个实例变量(@template)收到给定的函数调用(deliver)。

但是,使用以下代码,assigns会在posts之前进行评估,因此assignsnil

  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)

3 个答案:

答案 0 :(得分:1)

假设@templateTemplate对象的实例,您可以使用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