0

したがって、新しく登録されたユーザーが管理者によって承認される必要があるという単純なシナリオがあります。承認されると、メール通知が届きます。ただし、テストは最後のステップで失敗します。ここにキューがあります:

@javascript
Scenario: approving users
  Given user exists with email: "user@site.com", approved: false
    And I am on the admin panel
  When I approve the user user@site.com
  Then user should exist with email: "user@site.com", approved: true
    And the page should have no "approve" items
    And an email should have been sent to "user@site.com" with the subject "user_mailer.notify_approved.subject"

ステップ定義 (ここにあります) は、ActionMailer 配信でメールを検索しようとしますが、見つかりません。

テストが失敗する原因は、私のテスト セットアップで、サーバー インスタンスを実行せずにリモート サーバーに接続するように Capybara に指示したことです (自己署名証明書を使用したシン)。セットアップは次のとおりです。

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

Capybara が承認リンクをクリックすることによってトリガーされ、リモート テスト サーバーからメールが送信されるため、配信が失われているようです。

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

したがって、問題は、このシナリオでメールが本当に配信されたかどうかを何らかの方法で確認する方法があるかどうかです。私が考えることができる 1 つの方法は、上記の手順を拡張して、同じコードをローカルで実行する対応するユーザー インスタンスもローカルで更新することですが、それはにおいがするようです。SSL を使用しないのは別の問題かもしれませんが、実際には https で実行する必要があります。他のオプションはありますか?

4

1 に答える 1

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

追加された 3 行により、メール通知コールバックもローカルでトリガーされるようになります。

于 2013-02-24T06:49:33.807 に答える