4

目前在我的开发环境中,使用后我没有在ActionMailer::Base.deliveries表中看到任何内容mail。有没有我缺少的设置?

配置/环境/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 emailundefined method subject for nil:NilClass (NoMethodError)

谢谢!

4

4 回答 4

10

另一种可能性可能是在 config/environments/test.rb 你有

config.action_mailer.delivery_method = :test

但你已经设置

config.action_mailer.perform_deliveries = false

所以改变为

config.action_mailer.perform_deliveries = true

在我的情况下让它再次工作。

于 2012-12-14T12:25:17.047 回答
2

老问题,我知道,但我想到了几件事:

  • 您谈论了您的开发环境的配置 ( config/environments/development.rb),但您的测试不起作用。检查config/environments/test.rb,也许config\application.rb

  • 我实际上想在我的开发环境中查看电子邮件数组,但它总是在控制台中返回 nil。我终于意识到,因为数组只是一个内存对象,不在数据库中,所以控制台(rails c)看不到服务器(rails s)中发生了什么。当我添加<%= ActionMailer::Base.deliveries.count %>到视图中时,我可以立即看到该数组在开发中被填充。

  • 如果您使用单独的线程或任务来发送电子邮件,则会出现另一种“我无法从控制台看到该进程”的情况。使用delayed_job,我发现这个答案建议您可以使用 来查看作业(而不是实际的电子邮件)Delayed::Job.last.handler,它确实查看了数据库,因此可以跨进程工作。然而,这仅在作业仍在数据库中时有效,即在工作人员处理它之前。

于 2014-04-10T01:01:29.370 回答
0

您收到的错误表明电子邮件为零。换句话说,deliveries.last 方法返回 nil,因为其中没有电子邮件。

可能有很多原因......我假设您使用黄瓜作为测试机制?

1.验证'click_button'提交

您可以尝试放置 puts 或 log 语句。确保当您运行 cucumber 功能时,它会实际打印。有时这些事情不起作用,因为前端逻辑不起作用并且测试正确失败。换句话说,您期望触发的控制器端点没有被触发。

2. 验证 'send_email' 是否正确 - 使用单元测试

接下来,验证您是否确实在发送电子邮件。编写一个单元测试来验证它是否有效。这应该快速且容易上手。那里有很多文章。

最后,不是真的相关,但您可能希望使用email-spec,它应该提供一些不错的测试方法,这样您就不必重新发明轮子。

于 2012-05-16T04:37:57.387 回答
0

在进行@Dominik Steiner 回答的更改后,如果它仍然不起作用,

另一种可能性可能是在 config/initializers/mailer.rb 中,您应该有:

ActionMailer::Base.delivery_method = :test

以上在我的情况下丢失了,它现在可以工作了。

于 2018-01-15T07:32:13.707 回答