私の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配列をクリアする最良の方法は何ですか?
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
各テスト後の配信を非常に簡単にクリアして、spec_helper.rbに追加できます。
RSpec.configure do |config|
config.before { ActionMailer::Base.deliveries.clear }
end
私は Railsでの正しい電子メール設定 に関する私の記事を読むことをお勧めします。ここでは、それらを正しくテストすることについても話します。
Andy Lindemanが指摘するように、配送のクリアはメーラーテストのために自動的に行われます。ただし、他のタイプの場合は、ラッピングブロックに, :type => :mailer
を追加するだけで、同じ動作が強制されます。
describe "tests that send emails", type: :mailer do
# some tests
end