如何使用RSpec测试Rails 3.2 ActionMailer是否正在呈现正确的视图模板?

时间:2014-01-04 08:46:00

标签: ruby-on-rails rspec actionmailer rspec-rails

我正在使用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 "cs@mycompany.com"

      # 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 "....." 

它有效。我正在为邮件寻找类似的东西。

2 个答案:

答案 0 :(得分:0)

好的,我明白你现在想要达到的目标。

您应该能够通过在邮件程序中为使用特定参数调用的mail方法设置期望来测试调用哪个模板。

在测试中试试这个:

MyMailer.should_receive(:mail).with(hash_including(:template => 'expected_template'))

答案 1 :(得分:0)

我认为这更接近上面的答案,因为它确实测试了隐式模板。

    # 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