【问题标题】:Using rspec to confirm a function is called within a controller使用 rspec 确认在控制器中调用函数
【发布时间】:2013-08-15 16:49:48
【问题描述】:

我正在尝试通过 rspec 测试确认在控制器方法中调用了一个函数。为此,我正在关注confirming an instance of a class receives a message 的 relishapp 文档。我的实现如下:但是,我不断收到以下错误:

  it "does the job" do
    expect {
      post :create, {:obj => valid_attributes}
    }.to change(Object, :count).by(1)
    Object.any_instance.should_receive(:delay)
    flash[:notice].should eq(I18n.t(:success, obj: 'object', past_participle: 'created'))
    response.should redirect_to(new_object_path)
  end

但是,我不断收到以下错误:

Failure/Error: Unable to find matching line from backtrace
   Exactly one instance should have received the following message(s) but didn't: delay

在这种情况下,我试图确认调用了 delay 方法。可以清楚的看到在controller方法中调用了方法,rspec为什么不确认呢?

【问题讨论】:

  • 在发出 post 请求之前先拨打 should_receive 电话。
  • 这实际上阻止了规范通过。我现在根据我检查的方法得到不同的错误,但控制器方法永远不会起作用。请参阅此粘贴中错误的详细说明:pastie.org/private/yvvanhw95fnrercqth9ugg

标签: ruby-on-rails rspec


【解决方案1】:

在我看来,有两种方法可以测试这种行为。

您可以在测试时忽略cio_register() 方法的延迟,正如延迟作业文档所建议的那样,使用Delayed::Worker.delay_jobs = false。我相信这是因为我们可以放心地假设延迟作业会起作用。

我会重写测试如下:

describe '#create'
  it 'creates a new Object' do
    expect {
      post :create, {:object => valid_attributes}
    }.to change(Object, :count).by(1)
  end

  it 'performs CIO registration on new object' do
    # Skip Delayed Jobs.
    original_setting = Delayed::Worker.delay_jobs
    Delayed::Worker.delay_jobs = false

    # Our expectation.
    Object.any_instance.should_receive(:cio_register)

    post :create, {:object => valid_attributes}

    # Restore Delayed Job's setting.
    Delayed::Worker.delay_jobs = original_setting
  end

  it 'sets appropriate flash message'
  it 'redirects to path showing details of newly created Object'
end

如果延迟对方法的行为至关重要,您可以在测试中工作并确保其结果:

it 'performs CIO registration on new object' do
  # Our expectation.
  Object.any_instance.should_receive(:cio_register)

  post :create, {:object => valid_attributes}

  # Let's process the delayed job.
  Delayed::Worker.new.work_off
end

我在谷歌搜索时发现了这个有趣的条目:http://artsy.github.io/blog/2012/08/16/testing-with-delayed-jobs/

【讨论】:

  • 谢谢,我没想到要查看有关专业测试的延迟作业文档。
  • 另外,对于遇到此问题的任何人,我使用了第二个代码 sn-p
猜你喜欢
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-08
  • 2021-08-31
  • 2017-04-23
  • 1970-01-01
相关资源
最近更新 更多