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