rspec 测试未调用自定义 ActionMailer 传送方法

Custom ActionMailer delivery method not called from rspec test

我正在尝试编写一个 rspec 测试,它将使用我为 ActionMailer 自定义的发送方法发送电子邮件。

我的自定义交付方式实现:

class MyCustomDeliveryMethod  

  def deliver!(message)
    puts 'Custom deliver for message: ' + message.to_s
    ...
  end

Rspec代码:

it "should send an email" do
  WebMock.allow_net_connect!
  ActionMailer::Base.add_delivery_method( :api, MyCustomDeliveryMethod)
  ActionMailer::Base.perform_deliveries = true

  puts 'expecting this to call my custom delivery method'

  ActionMailer::Base.mail( :to => 'me@example.com',
    :subject => 'here is a test subject sent by ActionMailer',
    :body => 'here is a test body sent by <i>ActionMailer</i>',
    :delivery_method => :api 
  )

end

test.rb

config.action_mailer.delivery_method = :api

但是我从来没有看到 'custom deliver' 字符串。我的其他测试使用 class 的其他方法很好,只是 deliver!() 方法的触发不起作用。我错过了什么?

(注意。有一些关于使用 rspec 测试 ActionMailers 的示例,但它们似乎指的是模拟邮件程序行为,这不是我想要的 - 我希望实际的电子邮件发送出去).

我不太确定,但我认为问题是您的 MyCustomMailer class 不是从 ActionMailer::Base 继承的。

检查 this 文档。
这里ApplicationMailer继承自ActionMailer::Base,用于设置一些默认值。

而实际的邮件程序 class UserMailer 继承自 ApplicationMailer
如果你愿意,你可以跳过额外的 class 并直接继承,即

class MyCustomMailer < ActionMailer::Base
  ...
end

终于到了。缺少两件事:

自定义交付 class 必须定义一个采用一个参数的初始化方法。例如

def initialize(it)
end

您需要.deliver_now邮件才能触发,所以完整的调用代码例如

it "should send an email" do
  WebMock.allow_net_connect!
  ActionMailer::Base.add_delivery_method( :api, MyCustomDeliveryMethod)
  ActionMailer::Base.perform_deliveries = true

  puts 'expecting this to call my custom delivery method'

  ActionMailer::Base.mail( :to => 'me@example.com',
    :subject => 'here is a test subject sent by ActionMailer',
    :body => 'here is a test body sent by <i>ActionMailer</i>',
    :delivery_method => :api 
  ).deliver_now

end