【问题标题】:Rails, RSpec: How to test, that a specific mailer action gets triggeredRails,RSpec:如何测试特定的邮件操作是否被触发
【发布时间】:2017-03-02 18:11:06
【问题描述】:

我需要确保运行导入程序会发送电子邮件。

这是我目前得到的:

describe '#import' do
  it 'triggers the correct mailer and action', :vcr do
    expect(OrderMailer).to receive(:delivery_confirmation).with(order)

    Importer.new(@file).import
    remove_backed_up_file
  end
end

它失败了:

pry(#<ActiveRecord::ConnectionAdapters::TransactionManager>)> error
=> #<NoMethodError: undefined method `deliver_now' for nil:NilClass>

这显然无法解决,因为我期望 Mailer 类接收(实例)方法调用。但是我怎样才能获得将接收呼叫的邮件程序实例呢?你将如何测试一个单元的方法是否触发了某个邮件程序?

【问题讨论】:

    标签: ruby-on-rails rspec


    【解决方案1】:

    我假设delivery_confirmation 方法实际上返回一个Mail 对象。问题是ActionMailer 会调用邮件对象的deliver 方法。您已经设置了一个排除 delivery_confirmation 方法的期望,但您还没有指定返回值应该是什么。试试这个

    mail_mock = double(deliver: true)
    # or mail_mock = double(deliver_now: true)
    expect(mail_mock).to receive(:deliver)
    # or expect(mail_mock).to receive(:deliver_now)
    allow(OrderMailer).to receive(:delivery_confirmation).with(order).and_return(mail_mock)
    # the rest of your test code
    

    【讨论】:

    • 您的解决方案很好地模拟了 Mailer 的实现。虽然,而不是:expect(mail_mock).to receive(:deliver_now) 我建议allow(mail_mock).to receive(:deliver_now)。在您的示例中,`expect` 是一个断言,将至少调用一次 Deliver,我认为在 before(:each) block of code 中模拟这个邮件是很好的。
    【解决方案2】:

    如果我没听错的话,

    expect_any_instance_of(OrderMailer).to receive(:delivery_confirmation).with(order)
    

    将测试接收调用的邮件程序实例。

    为了更精确,您可能希望使用 OrderMailer 的特定实例(假设为 order_mailer)设置您的测试,并按以下方式编写您的期望

    expect(order_mailer).to receive(:delivery_confirmation).with(order)
    

    【讨论】:

    • 我如何才能获得最终会收到呼叫的实例?仅仅实例化类并不能保证 Rails 会使用这个实例,对吗?
    • 抱歉,我没有邮件测试的经验,无法回答您应该如何做。但一般来说,您可以使用自己的 OrderMailer 实例来存根 OrderMailer.newOrderMailer.create,以确保您的测试将完全处理您的实例。示例为allow(OrderMailer).to receive(:create).and_return(order_mailer)order_mailer 必须在那个时候创建​​。
    猜你喜欢
    • 2011-09-15
    • 2017-02-12
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 2013-06-01
    相关资源
    最近更新 更多