Add*_*dsy 3 ruby-on-rails actionmailer ruby-on-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
Run Code Online (Sandbox Code Playgroud)
在我的控制器中,我有以下行
UserMailer.changes_approved(@page_revision.created_by, @page_revision.page).deliver
Run Code Online (Sandbox Code Playgroud)
但是我的测试在此时失败并出现错误:
未定义的方法`deliver'代表nil:NilClass
当我在开发站点上触发相同的操作(http:// localhost:3000通过浏览器)时,电子邮件被正确发送出去,一切都很愉快
并且为了进一步增加混淆,我正在使用设计进行身份验证,并且电子邮件似乎在测试和开发模式下都能正常工作.当然,我没有得到同样的错误,根据我的电子邮件规范测试,每个人都在工作
所以这让我相信我的邮件有问题,而不是我的测试邮件配置本身,但我不知道是什么.我们欢迎所有的建议
谢谢
mon*_*ike 10
我使用https://gist.github.com/1031144 进行转换
# Rails 2 method:
UserMailer.should_receive(:deliver_signup)
Run Code Online (Sandbox Code Playgroud)
至
# Cumbersome Rails 3 method:
mailer = mock
mailer.should_receive(:deliver)
UserMailer.should_receive(:signup).and_return(mailer)
Run Code Online (Sandbox Code Playgroud)
我有一个类似的问题 - 可能是UserMailer.changes_approved方法被替换为模拟方法,它返回nil(我没有使用shoulda进行该测试,但这是我最好的猜测).
我的代码看起来像这样(修改后使用你的例子):
UserMailer.expects(:changes_approved).once
Run Code Online (Sandbox Code Playgroud)
我用一个额外的存根修复了它:
@mailer = stub(:deliver)
UserMailer.expects(:changes_approved).once.returns(@mailer)
Run Code Online (Sandbox Code Playgroud)
nil现在被@mailer取代.