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

时间:2016-07-04 16:51:11

标签: ruby-on-rails ruby rspec actionmailer

我正在尝试编写一个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

但是我从来没有看到过定制的&#39;串。我的其他测试运行了类的其他方法,它只是触发deliver!()方法不起作用。我错过了什么?

(注意:有一些使用rspec测试ActionMailers的例子,但是它们似乎是指模仿邮件程序行为,这不是我想要的 - 我希望实际的电子邮件能够用完。)

2 个答案:

答案 0 :(得分:1)

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

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

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

class MyCustomMailer < ActionMailer::Base
  ...
end

答案 1 :(得分:0)

到最后到达那里。缺少两件事:

自定义传递类必须定义一个带有一个参数的初始化方法。 e.g。

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