为什么电子邮件没有进入ActionMailer :: Base.deliveries表?

时间:2012-05-15 23:22:19

标签: ruby-on-rails

目前在我的开发环境中,在使用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)

谢谢!

4 个答案:

答案 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.rbconfig\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

我的案例中缺少以上内容,现在已经有效了。