2013-02-21 6 views
0

Итак, у меня есть простой сценарий, когда администратор должен одобрить зарегистрированного пользователя. После утверждения они получают уведомление по почте. Тест, однако, терпит неудачу на последнем этапе. Вот огурчик:тестирование доставки 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. Есть ли другие варианты?

ответ

0

ИТАК из-за отсутствие ответа, вот как я ее решил:

When /^I approve the user (.*?)$/ do |email| 
    page.find(:xpath, "//tr[descendant::a[text()='#{email}']]/td[@class='actions']//li[@class='approve']/a").click 

    u = User.find_by_email(email) 
    u.approved = true 
    u.save 
end 

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

Смежные вопросы