Пытаюсь избежать отправки писем, когда адрес электронной почты заканчивается на ".old"

Мне нужно переопределить метод 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

но у меня все еще тот же результат.

Похоже, что метод deliver генерирует пустое письмо? Я бы хотел, чтобы вообще ничего не генерировалось. Вот письмо из массива deliveries:

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
6
задан Ramy 19 January 2012 в 17:24
поделиться