测试ActiveRecord回调的存在

时间:2014-10-22 23:10:19

标签: ruby-on-rails rspec rspec3

如何测试模型中是否存在回调,特别是通过创建记录触发的回调,例如after_createafter_commit on: :create

这是一个调用它的(空)方法的示例回调。

# app/models/inbound_email.rb

class InboundEmail < ActiveRecord::Base
  after_commit :notify_if_spam, on: :create

  def notify_if_spam; end
end

这是使用RSpec 3的未决规范。

# spec/models/inbound_email_spec.rb

describe InboundEmail do
  describe "#notify_if_spam" do
    it "is called after new record is created"
  end
end

使用message expectation测试方法被调用似乎是要走的路。 例如:

expect(FactoryGirl.create(:inbound_email)).to receive(:notify_if_spam)

但这并不奏效。另一种方法是测试创建记录时,调用方法内部发生了什么(例如发送电子邮件,记录消息)。这意味着该方法确实被调用,因此回调存在。但是,我发现这是一个草率的解决方案,因为您正在测试其他内容(例如,已发送电子邮件,已记录消息),因此我并未寻找类似的解决方案。

1 个答案:

答案 0 :(得分:3)

我认为张柏芝是对的。这应该工作。您的示例的问题是,在期望已设置之前,回调已被称为

describe InboundEmail do
  describe "#notify_if_spam" do
    it "is called after new record is created" do
      ie = FactoryGirl.build(:inbound_email)
      expect(ie).to receive(:notify_if_spam)
      ie.save!
    end
  end
end