我正在使用邮件拦截器,如下所示:
setup_mail.rb
Mail.register_interceptor(MailInterceptor) if Rails.env != "production"
MailInterceptor类
class MailInterceptor
def self.delivering_email(message)
message.subject = "#{message.subject} [#{message.to}]"
message.to = "[email protected]"
end
end
我无法为此拦截器创建rspec,因为rake spec不会发生这种情况。
我有以下规格:
describe "MailInterceptor" do
it "should be intercepted" do
@email = UserMailer.registration_automatically_generated(@user)
@email.should deliver_to("[email protected]")
end
end
在test.log中,我看到deliver_to不是拦截器。关于如何为拦截器编写rspec的任何想法?
谢谢
最佳答案
deliver_to
的email_spec匹配器实际上并不通过典型的传递方法来运行邮件,而是将simply inspects the message用于发送给谁。
要测试您的拦截器,您可以直接调用delivery_email方法
it 'should change email address wen interceptor is run' do
email = UserMailer.registration_automatically_generated(@user)
MailInterceptor.delivering_email(email)
email.should deliver_to('[email protected]')
end
另一个选择是让邮件正常发送,并使用email_spec的
last_email_sent
测试邮件是否发送到正确的位置it 'should intercept delivery' do
reset_mailer
UserMailer.registration_automatically_generated(@user).deliver
last_email_sent.should deliver_to('[email protected]')
end
同时使用这两个测试可能是一个好主意,首先要确保
MailInterceptor
会按您期望的那样更改消息。第二项测试更多是集成测试,它测试MailInterceptor
是否已连接到交付系统。关于ruby-on-rails - 如何为邮件拦截器编写RSpec?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7639415/