【问题标题】:Test presence of ActiveRecord callbacks测试 ActiveRecord 回调的存在
【发布时间】:2014-10-22 23:10:18
【问题描述】:

如何测试模型中是否存在回调,特别是通过创建记录触发的回调,例如 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)

但这不起作用。另一种方法是测试创建记录时,被调用方法内部发生的事情(例如发送的电子邮件、记录的消息)。这意味着该方法确实被调用,因此存在回调。但是,我发现这是一个草率的解决方案,因为您实际上是在测试其他东西(例如发送的电子邮件、记录的消息),所以我不是在寻找这样的解决方案。

【问题讨论】:

  • 你为什么不喜欢消息期望?
  • @PhilipHallstrom 我不确定你为什么认为我不喜欢消息期望?我认为解决方案可能涉及消息期望,如我的示例中所述。
  • 这个问题不清楚。是否要测试该方法是否存在?或者是否调用了回调?
  • @Substantial 我想测试回调是否存在并调用正确的方法。在我看来,测试是否在创建记录时调用方法 notify_if_spam 是最明显的方法。
  • 如果你构建对象(不要保存它),设置你的期望然后保存它会起作用吗?

标签: ruby-on-rails rspec rspec3


【解决方案1】:

我认为 Frederick Cheung 是对的。这应该有效。你的例子的问题是回调已经被调用之前期望已经设置。

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

【讨论】:

  • 就是这样!只需在您的示例中将 create 替换为 save 即可。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-04-22
  • 2017-07-17
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
  • 2014-08-31
  • 2012-02-06
  • 1970-01-01
相关资源
最近更新 更多