2

所以根据我的理解,我相信你这样做

Resque.inline = Rails.env.test?

您的 resque 任务将同步运行。我正在编写一个关于在after_commit回调期间排队的 resque 任务的测试。

after_commit :enqueue_several_jobs

#class PingsEvent < ActiveRecord::Base
...
   def enqueue_several_jobs
      Resque.enqueue(PingFacebook, self.id)
      Resque.enqueue(PingTwitter, self.id)
      Resque.enqueue(PingPinterest, self.id)
   end

.perform我的 Resque 任务类的方法中,我正在做一个Rails.logger.info并且在我的测试中,我正在做类似的事情

..
Rails.logger.should_receive(:info).with("PingFacebook sent with id #{dummy_event.id}")
PingsEvent.create(params)

我对PingTwitter和有相同的测试PingPinterest

我在第二个和第三个期望上都失败了,因为似乎测试实际上在所有 resque 作业运行之前就完成了。只有第一个测试真正通过。RSpec 然后抛出一个MockExpectationError告诉我其他两个测试Rails.logger没有收到的消息。.info有人有过这方面的经验吗?

编辑

有人提到它的should_receive行为类似于 a mock,而我应该这样做.exactly(n).times。很抱歉没有早点说清楚,但我对不同的it区块有我的期望,我不认为should_receive一个it区块会在下一个区块模拟它it?让我知道我是否错了。

4

2 回答 2

2
class A
  def bar(arg)
  end

  def foo
    bar("baz")
    bar("quux")
  end
end

describe "A" do
  let(:a) { A.new }

  it "Example 1" do
    a.should_receive(:bar).with("baz")
    a.foo # fails 'undefined method bar'
  end
  it "Example 2" do
    a.should_receive(:bar).with("quux")
    a.foo # fails 'received :bar with unexpected arguments
  end
  it "Example 3" do
    a.should_receive(:bar).with("baz")
    a.should_receive(:bar).with("quux")
    a.foo # passes
  end
  it "Example 4" do
    a.should_receive(:bar).with(any_args()).once
    a.should_receive(:bar).with("quux")
    a.foo # passes
  end
end

像存根一样,消息期望取代了方法的实现。满足期望后,对象将不再响应方法调用——这将导致“未定义的方法”(如示例 1 中所示)。

示例 2 显示了当期望因参数不正确而失败时会发生什么。

示例 3 展示了如何对同一方法的多次调用进行存根——按照接收顺序使用正确的参数对每个调用进行存根。

示例 4 表明您可以使用any_args()帮助程序在一定程度上减少这种耦合。

于 2012-08-28T02:42:15.250 回答
1

使用should_receive的行为就像一个模拟。对具有不同参数的同一个对象有多个期望是行不通的。如果您更改对Rails.logger.should_receive(:info).exactly(3).times规范的期望,则可能会过去。

综上所述,您可能想要断言比为这些规范记录的内容更相关的内容,然后您可能会有多个有针对性的期望。

规格之间不会被拆除,因此Rails.logger期望是否在不同的示例中并不重要。为两个单独的示例吐出记录器的对象 ID 说明了这一点:

it 'does not tear down rails logger' do
  puts Rails.logger.object_id # 70362221063740
end

it 'really does not' do
  puts Rails.logger.object_id # 70362221063740
end
于 2012-08-27T22:07:37.700 回答