Rails 4, RSpec 3.2 - 如何模拟 ActionMailer 的 Deliver_now 方法来引发异常

Posted

技术标签:

【中文标题】Rails 4, RSpec 3.2 - 如何模拟 ActionMailer 的 Deliver_now 方法来引发异常【英文标题】:Rails 4, RSpec 3.2 - how to mockup ActionMailer's deliver_now method to raise exceptions 【发布时间】:2015-07-11 05:56:16 【问题描述】:

环境

Ruby 2.2.1、Rails 4.2.0、rspec-core 3.2.2、rspec-expectations 3.2.0、rspec-mocks 3.2.1、rspec-rails 3.2.1、rspec-support 3.2.2

我有以下方法

def send_event_alert_email(event_id)
  event = Event.find_by(id: event_id)
  ...
  ...     
  ...
  EventAlertMailer.event_alert(event_id).deliver_now

  create_alert(event)
end

我需要编写规范以确保create_alert(event)EventAlertMailer.event_alert(event_id).deliver_now 引发任何异常时不会被调用。所以基本问题是我如何模拟deliver_now 来引发它可能实际抛出的异常。

【问题讨论】:

【参考方案1】:

这里是如何测试 deliver_now 方法:

describe EventAlertMailer do
  it 'sends email' do
    delivery = double
    expect(delivery).to receive(:deliver_now).with(no_args)

    expect(EventAlertMailer).to receive(:event_alert)
      .with(event_id)
      .and_return(delivery)

    MyClass.send_event_alert_email
  end
end

【讨论】:

以上是关于Rails 4, RSpec 3.2 - 如何模拟 ActionMailer 的 Deliver_now 方法来引发异常的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 rspec 测试 Cloudinary rails 和 Attachinary?

如何测试 belongs_to 与 Rails 6 和 RSpec 4.1 的关联?

如何在 rspec rails 请求测试中发布缺少authentity_token 的帖子?

使用Rspec存根和模拟在Rails Oauth中实现100%的测试覆盖率

devise 和 rspec-rails - 如何在请求类型规范(带有 type: :request 标记的规范)中登录用户?

rake 规范不使用 rails 环境