Как мога да тествам с RSpec дали Rails 3.2 ActionMailer изобразява правилния шаблон за изглед?

Използвам rspec-rails и искам да тествам, че моята поща изобразява правилния шаблон за изглед.

describe MyMailer do
  describe '#notify_customer' do
    it 'sends a notification' do
      # fire
      email = MyMailer.notify_customer.deliver

      expect(ActionMailer::Base.deliveries).not_to be_empty
      expect(email.from).to include "[email protected]"

      # I would like to test here something like
      # ***** HOW ? *****
      expect(template_path).to eq("mailers/my_mailer/notify_customer")
    end
  end
end

Това валиден подход ли е? Или да направя нещо съвсем различно от това?

Актуализация

MyMailer#notify_customer може да има някаква логика (напр. в зависимост от локала на клиента) за избор на различен шаблон при различни обстоятелства. Това е повече или по-малко подобен проблем с контролерите, изобразяващи различни шаблони за изглед при различни обстоятелства. С RSpec можете да пишете

expect(response).to render_template "....." 

и работи. Търся нещо подобно за мейлърите.


person p.matsinopoulos    schedule 04.01.2014    source източник
comment
защо искаш да тестваш това? пътят на изгледа се определя от името на метода на мейлъра. Тук едва ли има нещо, което да се обърка.   -  person Dominik Goltermann    schedule 04.01.2014
comment
@DominikGoltermann Вижте моята актуализация по-горе   -  person p.matsinopoulos    schedule 05.01.2014


Отговори (2)


Мисля, че това е стъпка по-близо до отговора по-горе, тъй като тества за имплицитни шаблони.

    # IMPORTANT!
    # must copy https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/support/helpers/next_instance_of.rb
    it 'renders foo_mail' do
      allow_next_instance_of(described_class) do |mailer|
        allow(mailer).to receive(:render_to_body).and_wrap_original do |m, options|
          expect(options[:template]).to eq('foo_mail')

          m.call(options)
        end
      end

      body = subject.body.encoded
    end
person lulalala    schedule 12.01.2021

Добре, разбирам какво се опитваш да постигнеш сега.

Трябва да можете да тествате кой шаблон се извиква, като зададете очаквания във вашия имейл за метода mail, който е бил извикан с конкретни аргументи.

Опитайте това във вашия тест:

MyMailer.should_receive(:mail).with(hash_including(:template => 'expected_template'))
person Jon    schedule 04.01.2014
comment
Не, не искам да тествам съдържанието на определен шаблон. Това е спецификацията на гледната точка, както казвате. Моля, вижте моята актуализация. Има случаи, когато action_x изобразява различни шаблони за изглед въз основа на някакъв вид логика. Искам да тествам тази логика. - person p.matsinopoulos; 05.01.2014
comment
Бих искал да мога да тествам и това (кой шаблон се изобразява). Само кратка бележка за даденото тук решение: не мисля, че това работи за случаите, когато изобразеният шаблон е имплицитно (изобразява шаблона, съответстващ на името на действието по подразбиране). - person Tyler Rick; 25.02.2014