0

モデル内のコールバック、特にレコードの作成によってトリガーされるコールバックの存在をどのようにテストできます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

メッセージの期待値を使用して、メソッドが呼び出されたことをテストする方法のようです。例えば:

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

しかし、それはうまくいきません。もう 1 つの方法は、レコードが作成されたときに、呼び出されたメソッド内で何かが発生することをテストすることです (たとえば、電子メールの送信、メッセージのログ記録)。これは、メソッドが呼び出されたため、コールバックが存在することを意味します。ただし、実際には何か他のもの (送信された電子メール、ログに記録されたメッセージ) をテストしているので、ずさんな解決策を見つけたので、そのような解決策を探していません。

4

1 に答える 1

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
于 2014-10-23T16:53:51.590 に答える