【发布时间】:2014-10-22 23:10:18
【问题描述】:
如何测试模型中是否存在回调,特别是通过创建记录触发的回调,例如 after_create 或 after_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