目前在我的开发环境中,在使用ActionMailer::Base.deliveries
之后,我在mail
表格中没有看到任何内容。我缺少一个设置吗?
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 :(得分:10)
另一种可能是在config / environments / test.rb中你有
config.action_mailer.delivery_method = :test
但你已经设置了
config.action_mailer.perform_deliveries = false
所以改为
config.action_mailer.perform_deliveries = true
让我的情况再次起作用。
答案 1 :(得分:2)
老问题,我知道,但有几件事情浮现在脑海中:
您谈到了开发环境的配置(config/environments/development.rb
),但您的测试并不起作用。查看config/environments/test.rb
和config\application.rb
。
我实际上想在我的开发环境中看到电子邮件阵列,但它总是在控制台中返回nil。我终于意识到,因为数组只是一个内存对象而不是数据库,所以控制台(rails c
)无法看到服务器中发生了什么(rails s
) 。当我将<%= ActionMailer::Base.deliveries.count %>
添加到视图中时,我可以立即看到数组在开发中被填充。
另一个&#34;我无法从控制台看到这个过程&#34;如果您使用单独的线程或任务发送电子邮件,则会出现这种情况。使用delayed_job
,我发现this answer建议您可以使用Delayed::Job.last.handler
查看作业(而不是实际的电子邮件),其中 查看数据库以便在流程。但是,这仅在作业仍在数据库中时工作,即在工作人员处理之前。
答案 2 :(得分:0)
您收到的错误表示该电子邮件为零。换句话说,deliveries.last方法返回nil,因为其中没有电子邮件。
可能有很多原因......我假设您使用黄瓜作为测试机制?
<强> 1。验证“click_button”是否提交
您可以尝试输入puts或log语句。确保在运行黄瓜功能时实际打印。有时这些东西不起作用,因为前端逻辑不起作用,测试失败正确。换句话说,您希望被触发的控制器端点没有被触发。
<强> 2。使用单元测试验证'send_email'是否正确
接下来,确认您确实在发送电子邮件。编写单元测试以验证其是否有效。这应该快速而容易地开始。那里有很多文章。
最后,并不是真的相关,但你可能想要使用email-spec,这应该提供一些不错的测试方法,所以你不必重新发明轮子。
答案 3 :(得分:0)
在@Dominik Steiner回答之后,如果它仍然无法正常工作,
另一种可能是在config / initializers / mailer.rb中,您应该:
ActionMailer::Base.delivery_method = :test
我的案例中缺少以上内容,现在已经有效了。