簡體   English   中英

使用rails 3中的ActionMailer以測試模式發送電子郵件

[英]Sending emails in test mode with ActionMailer in rails 3

我在使用Rails 3在測試模式下發送郵件時遇到了一個奇怪的問題

我的郵件似乎沒有返回任何東西。 例如,我有一個名為UserMailer的郵件程序。 用戶可以在應用程序中進行需要批准的更改,這樣就會有一個名為changes_approved的方法,該方法應該向用戶發送一封電子郵件,通知他們他們的更改已被批准。

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

但是我的測試在此時失敗並出現錯誤:

未定義的方法`deliver'代表nil:NilClass

當我在開發站點上觸發相同的操作(http:// localhost:3000通過瀏覽器)時,電子郵件被正確發送出去,一切都很愉快

並且為了進一步增加混淆,我正在使用設計進行身份驗證,並且電子郵件似乎在測試和開發模式下都能正常工作。 當然,我沒有得到同樣的錯誤,根據我的電子郵件規范測試,每個人都在工作

所以這讓我相信我的郵件有問題,而不是我的測試郵件配置本身,但我不知道是什么。 我們歡迎所有的建議

謝謝

我使用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)

我有一個類似的問題 - 可能是UserMailer.changes_approved方法被替換為模擬方法,它返回nil(我沒有使用shoulda進行該測試,但這是我最好的猜測)。

我的代碼看起來像這樣(修改后使用你的例子):

UserMailer.expects(:changes_approved).once

我用一個額外的存根修復了它:

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

nil現在被@mailer取代。

要測試延遲的動作郵件程序,我們需要先將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)

好吧,我找到了答案,

看起來問題就在於我測試這些郵件的方式。 在每個控制器測試中,我都有類似的線

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

雖然這個測試通過很好,但似乎打破了郵件本身。 我從測試中刪除了這一行,現在他們通過了確定。 對ActionMailer :: Base.deliveries.last的后續測試檢查發送的電子郵件的詳細信息是正確的,所以我很高興這條線不是必需的。

如果有人解釋為什么這會破壞,我會有興趣找出來

不管怎么說,多謝拉

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM