Очистка ActionMailer :: Base.deliveries после теста RSpec - PullRequest
57 голосов
/ 30 апреля 2011

У меня есть следующий тест 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?

Ответы [ 3 ]

81 голосов
/ 30 апреля 2011

Поскольку 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
49 голосов
/ 19 ноября 2014

Вы можете легко очистить доставки после каждого теста, добавив это в свой spec_helper.rb.

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

Я бы предложил прочитать мою статью о правильной конфигурации электронной почты в Rails где я говорю также о тестировании их правильно.

10 голосов
/ 11 марта 2014

Как отмечает Энди Линдеман, очистка доставок производится автоматически для тестов почтовой программы. Однако для других типов просто добавьте , :type => :mailer к блоку переноса, чтобы вызвать то же поведение.

describe "tests that send emails", type: :mailer do
  # some tests
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...