3

我们正在使用这样的 ActionMailer 拦截器:

class MailerInterceptor
  def self.delivering_email(message)
    p 1
    if message.to.include?("test2@example.com")
      p 2
      message.perform_deliveries = false
    end
  end
end

Mailer.register_interceptor(MailerInterceptor)

但它似乎并没有阻止在生产或我们的测试中向该地址发送消息:

require 'spec_helper'

describe "MailerInterceptor" do
  it "should block sending to certain addresses" do
    expect{ Mailer.user_alert("test1", "test@example.com").deliver }.to change{ ActionMailer::Base.deliveries.count }.by(1)
    expect{ Mailer.user_alert("test2", "test2@example.com").deliver }.to_not change{ ActionMailer::Base.deliveries.count }
  end
end

这是使用 rails 3.2.14。

它在测试的第二行打印“2”,但仍会发送电子邮件。有任何想法吗?谢谢!

4

2 回答 2

8

请检查您是否正在使用ActionMailer #delivery方法,而不是#delivery!因为第二个跳过检查 perform_deliveries。

于 2014-04-10T07:19:51.450 回答
1

尽管我可以提出一些可能对您有所帮助的建议,但您的代码中还需要一些详细信息

    Mailer.register_interceptor(MailerInterceptor)

它应该是

   ActionMailer::Base.register_interceptor(MailerInterceptor)

其次你message.perform_deliveries = false应该工作不知道为什么它不工作

你可以简单地尝试

  ActionMailer::Base.delivery_method = :test

代替

  message.perform_deliveries = false
于 2013-09-11T09:40:09.667 回答