Ruby on rails 测试是否存在ActiveRecord回调

Ruby on rails 测试是否存在ActiveRecord回调,ruby-on-rails,rspec,rspec3,Ruby On Rails,Rspec,Rspec3,如何测试模型中是否存在回调,特别是通过创建记录触发的回调,例如创建后的或提交后的:创建时的 下面是一个回调示例,其中包含它调用的(empty)方法 # app/models/inbound_email.rb class InboundEmail < ActiveRecord::Base after_commit :notify_if_spam, on: :create def notify_if_spam; end end 使用测试方法来测试该方法是否被调用似乎是一种可行的方

如何测试模型中是否存在回调,特别是通过创建记录触发的回调,例如创建后的
或提交后的
:创建时的

下面是一个回调示例,其中包含它调用的(empty)方法

# app/models/inbound_email.rb

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

  def notify_if_spam; end
end
使用测试方法来测试该方法是否被调用似乎是一种可行的方法。 例如:

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

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

我认为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

我认为张鉴泉是对的。这应该行得通。您的示例的问题是,在设置期望值之前已经调用了回调

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

我认为张鉴泉是对的。这应该行得通。您的示例的问题是,在设置期望值之前已经调用了回调

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

我认为张鉴泉是对的。这应该行得通。您的示例的问题是,在设置期望值之前已经调用了回调

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


你为什么不喜欢信息期望?@PhilipHallstrom我不知道你为什么认为我不喜欢信息期望?我认为解决方案可能会涉及一个消息期望,正如我在示例中提到的。这个问题不清楚。是否要测试该方法是否存在?或者是否调用了回调?@我想测试回调是否存在,并调用正确的方法。在我看来,测试在创建记录时是否调用了方法
notify\u if\u spam
,这是最明显的方法。如果构建对象(不保存),设置期望值,然后保存它,它是否有效?为什么不喜欢消息期望值?@PhilipHallstrom我不确定为什么你认为我不喜欢消息期望值?我认为解决方案可能会涉及一个消息期望,正如我在示例中提到的。这个问题不清楚。是否要测试该方法是否存在?或者是否调用了回调?@我想测试回调是否存在,并调用正确的方法。在我看来,测试在创建记录时是否调用了方法
notify\u if\u spam
,这是最明显的方法。如果构建对象(不保存),设置期望值,然后保存它,它是否有效?为什么不喜欢消息期望值?@PhilipHallstrom我不确定为什么你认为我不喜欢消息期望值?我认为解决方案可能会涉及一个消息期望,正如我在示例中提到的。这个问题不清楚。是否要测试该方法是否存在?或者是否调用了回调?@我想测试回调是否存在,并调用正确的方法。在我看来,测试在创建记录时是否调用了方法
notify\u if\u spam
,这是最明显的方法。如果构建对象(不保存),设置期望值,然后保存它,它是否有效?为什么不喜欢消息期望值?@PhilipHallstrom我不确定为什么你认为我不喜欢消息期望值?我认为解决方案可能会涉及一个消息期望,正如我在示例中提到的。这个问题不清楚。是否要测试该方法是否存在?或者是否调用了回调?@我想测试回调是否存在,并调用正确的方法。在我看来,测试在创建记录时是否调用了方法
notify\u if\u spam
,这是最明显的方法。如果构建对象(不保存),设置期望值,然后保存它,它是否有效?就是这样!在您的示例中,只需将
create
替换为
save
。谢谢,就这样!在您的示例中,只需将
create
替换为
save
。谢谢,就这样!在您的示例中,只需将
create
替换为
save
。谢谢,就这样!在您的示例中,只需将
create
替换为
save
。谢谢