2012-05-15 39 views
4

目前在我的開發環境中,在使用mail之後,我看不到ActionMailer::Base.deliveries表中的任何內容。有沒有我失蹤的設置?爲什麼電子郵件沒有進入ActionMailer :: Base.deliveries表?

config/environments/development.rb:
config.action_mailer.delivery_method = :test

應用程序/郵寄/ notifier.rb

def send_email(user) 
    mail(:to => user.email, :subject => "Welcome to our website!") 
end 

這些都是我在運行測試:

When /^I signup$/ do 
    visit signup_path 
    @user = FactoryGirl.build(:user) 
    fill_in "user_email", :with => @user.email 
    fill_in "user_password", :with => @user.password 
    click_button "Join now" 
end 

Then /^I should receive a confirmation email$/ do 
    email = ActionMailer::Base.deliveries.last 
    email.subject.should == "Welcome to our website!" 
end 

現在我得到了I should receive a confirmation email步以下錯誤: undefined method subject for nil:NilClass (NoMethodError)

謝謝!

+0

你有你的郵件視圖?你怎麼測試? – Ivan

回答

0

您收到的錯誤表明該電子郵件爲零。換句話說,deliveries.last方法返回nil,因爲裏面沒有郵件。

可能有許多原因......我假設你正在使用黃瓜作爲測試機制?

1.驗證 'click_button' 提交

你可以嘗試把看跌期權或日誌報表。確保當你運行黃瓜功能時,它實際上會打印。有時候這些東西不起作用,因爲前端邏輯不起作用,測試失敗。換句話說,你期望被觸發控制器端點沒有被觸發。

2.確認「SEND_EMAIL」是正確的 - 使用單元測試

接下來,驗證你實際上是發送電子郵件。編寫一個單元測試來驗證這個工作。這應該是快速和容易去。那裏有很多文章。

最後,沒有真正相關,但你可能想要與email-spec滾動,應該提供一些不錯的測試方法,所以你不必重新發明輪子。

9

另一個可能性是,在配置/環境/ test.rb你有

config.action_mailer.delivery_method = :test 

,但你已經設置

config.action_mailer.perform_deliveries = false 

所以改爲

config.action_mailer.perform_deliveries = true 

使工作再次在我的情況。

2

老問題,我知道,但有兩件事情浮現在腦海中:

  • 請您談一下您的開發環境(config/environments/development.rb)的配置,但它是你的測試運行不正常。檢查config/environments/test.rb也許config\application.rb

  • 我其實想在我的開發環境中看到email數組,但它總是在控制檯返回nil。我終於明白了,因爲數組僅僅是內存中的對象,而不是在數據庫中,控制檯(rails c)不能看到發生了什麼事情在服務器(rails s)。當我將<%= ActionMailer::Base.deliveries.count %>添加到視圖中時,我可以立即看到數組正在開發中。

  • 如果您使用單獨的線程或任務發送電子郵件,則會出現另一個「我無法從控制檯看到該進程」情況。通過delayed_job,我發現this answer建議您可以使用Delayed::Job.last.handler來查看作業(而不是實際的電子郵件),其中確實是查看數據庫,因此跨進程可以工作。然而,這隻在作業仍然在數據庫中時,即在工作人員處理之前才起作用。

+1

在控制檯上花費一個小時測試,謝謝x好回答 – coderVishal

0

使得通過@Dominik施泰納回答,如果它仍然沒有奏效更改後,

另一種可能性可能是在配置/初始化/ mailer.rb,你應該有:

ActionMailer::Base.delivery_method = :test 

上面缺少我的情況下,它現在的工作。

相關問題