Очистка ActionMailer:: Base.deliveries после теста RSpec
У меня есть следующий тест RSpec для моего класса UserMailer:
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
Этот тест прошел впервые, но второй раз я его не запускал. После небольшой отладки, кажется, что 1-й тест добавил элемент в массив ActionMailer:: Base.deliveries, и этот элемент никогда не очищался. Это приводит к сбою первой строки в тесте, поскольку массив не пуст.
Какой лучший способ очистить массив ActionMailer:: Base.deliveries после теста RSpec?
Ответы
Ответ 1
Так как 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
Ответ 2
Вы можете легко очистить поставки после каждого теста, добавив это в свой spec_helper.rb.
RSpec.configure do |config|
config.before(:each) { ActionMailer::Base.deliveries.clear }
end
Ответ 3
Как отмечает Энди Линдеман, очистка поставок производится автоматически для тестов почтовой программы. Однако для других типов просто добавьте , :type => :mailer
в блок упаковки, чтобы заставить одно и то же поведение.
describe "tests that send emails", type: :mailer do
# some tests
end