如何测试使用rspec调用方法?

时间:2016-02-14 16:45:23

标签: ruby-on-rails rspec

在模型规范中,我想测试某些方法是否被正确调用。

#models/object.rb
class Object < ActiveRecord::Base
  after_validation :do_this
  after_save :enqueue_that
  def do_this
    # does some stuff, the results of which I don't want to test
  end 
  def enqueue_that
    MyWorker.perform_later id
  end
end

#spec/models/object.rb

describe Object
  describe '#do_this' do
    it 'is called on save with passing validations' do
      object.save
      expect(object).to receive(:do_this)
    end
  end
  describe '#enqueue_that' do 
    it 'is called after save' do
      object.save
      expect(MyWorker).to receive(:perform_later).once
    end
  end
end

测试失败,内容如下

Failure/Error: expect(object).to receive(:do_this).once
  (#<Object:0x007fd2101c7160>).do_this(*(any args))
    expected: 1 time with any arguments
    received: 0 times with any arguments
Failure/Error: expect(MyWorker).to receive(:perform_later).once
  (MyWorker (class)).perform_later(*(any args))
     expected: 1 time with any arguments
     received: 0 times with any arguments

令人困惑的是,这些方法似乎在开发环境中表现正常。

我正确使用expect().to receive吗?或者让我的测试发现了一个真正的错误?

1 个答案:

答案 0 :(得分:6)

你的订单错误......

it 'is called on save with passing validations' do
  expect(object).to receive(:do_this)
  object.save
end