web-dev-qa-db-ja.com

RSpecテスト後のActionMailer :: Base.deliveriesのクリア

私のUserMailerクラスに次のRSpecテストがあります。

require "spec_helper"

describe UserMailer do
  it "should send welcome emails" do
    ActionMailer::Base.deliveries.should be_empty
    user = Factory(:user)
    UserMailer.welcome_email(user).deliver
    ActionMailer::Base.deliveries.should_not be_empty
  end
end

このテストは最初は合格しましたが、2回目に実行すると失敗しました。少しデバッグを行った後、最初のテストでActionMailer :: Base.deliveries配列にアイテムが追加され、そのアイテムがクリアされなかったようです。配列が空ではないため、テストの最初の行が失敗します。

RSpecテスト後にActionMailer :: Base.deliveries配列をクリアする最良の方法は何ですか?

58
Kevin Pang

AM :: Base.deliveriesは単なる配列なので、空の配列に初期化できます。あなたもそれが空であることの最初のチェックを取り除くことができます:

describe UserMailer do
  before { ActionMailer::Base.deliveries = [] }

  it "should send welcome emails" do
    user = Factory(:user)
    UserMailer.welcome_email(user).deliver
    ActionMailer::Base.deliveries.should_not be_empty
  end
end
81
Peter Brown

各テスト後の配信を非常に簡単にクリアして、spec_helper.rbに追加できます。

RSpec.configure do |config|
  config.before { ActionMailer::Base.deliveries.clear }      
end

私は Railsでの正しい電子メール設定 に関する私の記事を読むことをお勧めします。ここでは、それらを正しくテストすることについても話します。

49
coorasse

Andy Lindemanが指摘するように、配送のクリアはメーラーテストのために自動的に行われます。ただし、他のタイプの場合は、ラッピングブロックに, :type => :mailerを追加するだけで、同じ動作が強制されます。

describe "tests that send emails", type: :mailer do
  # some tests
end
10
d_rail