Итак, у меня есть простой сценарий, когда администратор должен одобрить зарегистрированного пользователя. После утверждения они получают уведомление по почте. Тест, однако, терпит неудачу на последнем этапе. Вот огурчик:тестирование доставки ActionMailer на удаленном хосте
@javascript
Scenario: approving users
Given user exists with email: "[email protected]", approved: false
And I am on the admin panel
When I approve the user [email protected]
Then user should exist with email: "[email protected]", approved: true
And the page should have no "approve" items
And an email should have been sent to "[email protected]" with the subject "user_mailer.notify_approved.subject"
Определение шага (это here) пытается найти почту в поставках ActionMailer и не может найти его.
Что делает сбой теста, так это то, что в моей тестовой настройке я говорю Capybara не запускать экземпляр сервера, а подключаться к удаленному серверу (Thin с самозаверяющим сертификатом). Вот установка:
config.use_transactional_fixtures = false
config.include Devise::TestHelpers, type: :controller
config.include FactoryGirl::Syntax::Methods
config.before(:suite) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
# have to run the test env server separately, e.g. with thin:
# thin start -p 5678 --ssl -e test
Capybara.configure do |c|
c.run_server = false
c.server_port = 5678
c.app_host = "https://localhost:%d" % c.server_port
end
Доставка по-видимому, отсутствует, потому что почта отправляется с удаленным сервера теста, активированной Капибарой щелкнув одобрять ссылку:
When /^I approve the user (.*?)$/ do |email|
page.find(:xpath, "//tr[descendant::a[text()='#{email}']]/td[@class='actions']//li[@class='approve']/a").click
end
Таким образом, вопрос, если есть способ как-то сказать, действительно ли почта была доставлена в этом сценарии. Один из способов, о котором я могу думать, - это расширить описанный выше шаг, чтобы также обновить соответствующий пользовательский экземпляр локально, который будет выполнять один и тот же код локально, но это, кажется, пахнет. Не использовать SSL может быть другой w/a, но я должен действительно запускать https. Есть ли другие варианты?