У меня есть требование переопределить метод ActionMailer mail
. Этот метод защищен, поэтому в подклассе я также определяю метод mail
как защищенный:
protected
def mail(headers={}, &block)
#add a check to avoid sending emails that end with ".old"
unless headers[:to] =~ /\.old$/
super(headers, &block)
end
end
таким образом, когда адрес исходящей электронной почты заканчивается на .old
, метод должен вернуть ноль и не отправлять электронную почту.
Однако в моем модульном тесте кажется, что электронное письмо все еще будет ActionMailer::Base.deliveries
вот мой модульный тест:
describe 'BaseNotifier' do
class TestNotifier < BaseNotifier
def mailer(to, from, subject)
mail(:to => to,
:from => from,
:subject => subject)
end
end
before(:each) do
ActionMailer::Base.delivery_method = :test
ActionMailer::Base.perform_deliveries = true
ActionMailer::Base.deliveries.clear
end
it "should not send emails to a user with an email that ends in '.old'" do
TestNotifier.mailer("some_email@gmail.com.old", "from@gmail.com", "test email").deliver
puts "what do we have here " + ActionMailer::Base.deliveries.first.to_s
ActionMailer::Base.deliveries.length.should == 0
end
end
Я создаю тестовый класс и подкласс класса, где почта переопределяется (это то, как она будет использоваться в системе). Затем я отправляю электронное письмо и вызываю метод .deliver
.
ОБНОВЛЕНИЕ: я думаю, что метод доставки не проблема. Когда я делаю это: puts TestNotifier.mailer("some_email@gmail.com.old", "from@gmail.com", "test email")
Я получаю то же электронное сообщение, что и ниже Я также попытался переопределить метод mail следующим образом:
def mail(headers={}, &block)
#add a check to avoid sending emails that end with ".old"
unless headers[:to] =~ /\.old$/
super(headers, &block)
else
super({:to=>nil, :from=>nil, :boundary =>nil, :date => nil, :message =>nil, :subject =>nil, :mime_version => nil,
:content_type => nil, :charset =>nil, :content_transfer_encoding => nil}, &block)
end
end
, который дает мне ошибку с undefined method 'ascii_only?' for nil:NilClass
в этой строке: TestNotifier.mailer("some_email@gmail.com.old", "from@gmail.com", "test email").deliver
ОБНОВЛЕНИЕ: Я также пытался сделать это с переопределенным mail
методом:
# создать класс, который переопределяет метод поставки, чтобы ничего не делать.
класс NonSendingEmail; Def Delivery; конец; конец
def mail (заголовки = {}, & block)
# добавить проверку, чтобы избежать отправки писем, заканчивающихся на ".old"
если заголовки [: to] = ~ /.old$/
супер (заголовки и блок)
еще
NonSendingEmail.new
конец
конец
но у меня все тот же результат.
Кажется, что метод deliver
генерирует пустое электронное письмо? Что я хотел бы сделать, так это вообще ничего не генерировать. Вот электронная почта из массива поставок:
Date: Thu, 19 Jan 2012 00:00:00 +0000
Message-ID: <4f18344f94d0_12267803589ac2731d@Ramys-MacBook-Pro.local.mail>
Mime-Version: 1.0
Content-Type: text/plain
Content-Transfer-Encoding: 7bit