[英]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.