Rails根据请求规范测试发送电子邮件

时间:2018-10-01 17:46:42

标签: ruby-on-rails ruby ruby-on-rails-4 rspec rspec-rails

我正在使用rails 4.2.4,并且试图测试是否已按照请求规范发送电子邮件。

it "sends a reset password email to the user" do
  expect do
    post users_reset_password_path, params, headers
  end.to change(ActionMailer::Base.deliveries, :size).by(1)
end

这导致:

end.to change(ActionMailer::Base.deliveries, :size).by(1)

expected `Array#size` to have changed by 1, but was changed by 0

我确定我的电子邮件已发送,因为我在log/test.log中看到了它。因此,我的要求是因为它是request规范而发生?如果是这样,我如何测试在请求规范中发送电子邮件? ActionMailer::Base.deliveries仅在邮件规范中更新吗?

为了提供更多上下文,我使用了devise,因此在控制器中我叫user.send_reset_password_instructions

1 个答案:

答案 0 :(得分:0)

事实证明,我的初始化程序已覆盖config/environments/test.rb中的配置。在邮件规范中,这很好,因为ActionMailer::TestCase强制ActionMailer::Base.delivery_method:test。在请求规范中不会发生这种情况。

无论如何,我必须:

diff --git a/config/initializers/mail.rb b/config/initializers/mail.rb
deleted file mode 100644
index 4b8000f..0000000
--- a/config/initializers/mail.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-ActionMailer::Base.smtp_settings = {
-    :address              => "example.com",
-    :port                 => 587,
-  } 
- 
-ActionMailer::Base.delivery_method = :smtp

并将这些设置添加到每个config/environment/文件中。