it-roy-ru.com

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

57
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

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

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