Очистка ActionMailer:: Base.deliveries после теста RSpec - программирование
Подтвердить что ты не робот

Очистка 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?

4b9b3361

Ответ 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