RSpec 和测试 Devise 的邮件

Posted

技术标签:

【中文标题】RSpec 和测试 Devise 的邮件【英文标题】:RSpec and testing Devise's mailer 【发布时间】:2013-05-30 17:59:02 【问题描述】:

我在 Devise 中发送确认电子邮件时遇到了一些问题。这就是为什么我想为此功能编写测试。如果我不创建自己的邮件程序,我怎么能做到这一点?

编辑

我决定,这就足够了:

it 'should send an email' do
  user
  put :complete, params
  user.send(:send_confirmation_notification?).should == true
end

如果我遗漏了什么,请告诉我。

【问题讨论】:

对于谷歌搜索的人:我目前正在使用的应用程序有 Devise 3.5.2,并且电子邮件正在被存根。不确定这是否是测试环境的默认设计,或者我只是错过了一些本地配置。我想说的是,有时您可能会遇到无法测试Devise.mailer.deliveries.sizeActionMailer::Base.deliveries.size 的情况,因为它们始终是0,因此唯一的方法是使用user.send_confirmation_notification? 进行测试,例如这个问题。小心哦!不要使用user.confirmed_at?,因为user.skip_confirmation! 正在设置此标志 【参考方案1】:

您是否查看过为 Devise 编写的测试?

https://github.com/plataformatec/devise/blob/master/test/mailers/confirmation_instructions_test.rb

【讨论】:

请求是针对 rspec,但设计的测试不使用 rspec。 不管是 RSpec、MiniTest 还是 Test::Unit,概念和在测试期间要查找的消息都很重要(答案 +1)【参考方案2】:

如果您想进行更明确的测试并实际测试电子邮件是使用 RSpec 发送的,这对我有用。

it 'sends a confirmation email' do
  user = FactoryGirl.build :user
  expect  user.save .to change(ActionMailer::Base.deliveries, :count).by(1)
end

【讨论】:

小心,设计邮件默认有自己的邮件,如果您发现副作用,请尝试Devise.mailer.deliveries而不是ActionMailer::Base.deliveries)

以上是关于RSpec 和测试 Devise 的邮件的主要内容,如果未能解决你的问题,请参考以下文章

使用登录设计的Rspec测试只工作一次

使用 rspec 进行 ActionMailer 测试 [关闭]

Rspec - 如何测试邮件是不是使用正确的模板

如何使用 RSpec 测试电子邮件标头

Rails/Rspec:测试延迟作业邮件

RSpec 测试不允许两个用户使用相同的电子邮件地址