Мне нужно переопределить метод mail
ActionMailer. Этот метод защищен, поэтому в подклассе я также определяю метод 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
, метод должен вернуть nil и не отправлять письмо.
Однако в моем модульном тесте кажется, что письмо все равно отправляется на 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
Я создаю тестовый класс и подкласс класса, в котором переопределена mail (именно так он будет использоваться в системе). Затем я создаю письмо и вызываю метод .deliver
.
UPDATE: я думаю, что проблема не в методе deliver. Когда я делаю это: ставлю 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
UPDATE: Я также попробовал сделать это с переопределенным mail
методом:
#создайте класс, который переопределяет метод deliver, чтобы ничего не делать. class NonSendingEmail; def deliver; end; end
def mail(headers={}, &block) #добавляем проверку, чтобы избежать отправки писем, которые заканчиваются на ".old" unless headers[:to] =~ /.old$/ super(headers, &block) else NonSendingEmail.new end end
но у меня все еще тот же результат.
Похоже, что метод Я бы хотел, чтобы вообще ничего не генерировалось. Вот письмо из массива deliveries: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