Отправка писем в тестовом режиме с помощью ActionMailer в рельсах 3 - PullRequest
3 голосов
/ 07 декабря 2010

У меня немного странная проблема с отправкой почты в тестовом режиме с Rails 3

Кажется, мои почтовые программы ничего не возвращают. Например, у меня есть почтовик, который называется UserMailer. Пользователи могут вносить изменения, которые требуют одобрения в приложении, так что у него есть метод под названием changes_approved, который должен отправить пользователю электронное письмо с уведомлением о том, что его изменения были утверждены.class

UserMailer < ActionMailer::Base

  default :from => "from@example.com"

  def changes_approved(user, page)

    @user = user
    @page = page

    mail(:to => user.email, :subject => "Your changes have been approved")

  end

end

В моем контроллере у меня есть следующая строка

UserMailer.changes_approved(@page_revision.created_by, @page_revision.page).deliver

Однако в этот момент мои тесты не пройдены с ошибкой:

неопределенный метод `доставить 'для nil: NilClass

Когда я запускаю те же действия на сайте разработки, хотя (http://localhost:3000 через браузер), электронные письма отправляются правильно, и все работает довольно счастливо

И чтобы еще больше сбить с толку, я использую devise для аутентификации и электронные письма, которые, кажется, работают правильно как в тестовом, так и в режиме разработки. Конечно, я не получаю ту же ошибку, и согласно моим тестам электронной почты, все работает

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

Спасибо

Ответы [ 4 ]

10 голосов
/ 12 октября 2011

Я использовал https://gist.github.com/1031144 конвертировать

# Rails 2 method:
UserMailer.should_receive(:deliver_signup)

до

# Cumbersome Rails 3 method:
mailer = mock
mailer.should_receive(:deliver)
UserMailer.should_receive(:signup).and_return(mailer)
5 голосов
/ 19 января 2011

У меня была похожая проблема - возможно, метод UserMailer.changes_approved заменяется на метод mock, который возвращает nil (я не использовал musta для этого теста, но это мое лучшее предположение).

Мой код выглядел следующим образом (модифицированный по вашему примеру):

UserMailer.expects(:changes_approved).once

Я исправил это с помощью дополнительной заглушки:

@mailer = stub(:deliver)
UserMailer.expects(:changes_approved).once.returns(@mailer)

Теперь ноль заменен на @ mailer.

2 голосов
/ 04 мая 2011

Чтобы протестировать почтовую программу с отложенным действием, нам нужно сначала изменить конфигурацию delayed_job (в config / initializers / delayed_job_config.rb) на

Delayed::Worker.delay_jobs = !Rails.env.test?

и в ваших тестах ожидание должно быть установлено на

mock_mail = mock(:mail)
mock_mail.should_receive(:deliver)
UserMailer.should_receive(:changes_approved).with(user, page).and_return(mock_mail)
1 голос
/ 07 декабря 2010

Ну, я нашел ответ,

похоже, проблема была в том, как я тестировал эти почтовые программы. В каждом из тестов контроллера у меня была строка, похожая на

UserMailer.should_receive(:changes_approved).with(user, page)

Пока этот тест проходил нормально, он, похоже, сломал сам почтовик. Я удалил эту строку из тестов, и теперь они проходят нормально. Последующие тесты ActionMailer :: Base.deliveries.last для проверки правильности сведений об отправленном электронном письме выглядят нормально, поэтому я рад, что эта строка не нужна.

Если у кого-нибудь есть объяснение, почему это нарушается, мне было бы интересно узнать

Спасибо в любом случае

...