Как я могу проверить с помощью 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