RSpec捣毁邮件

时间:2015-07-31 17:58:34

标签: ruby-on-rails ruby rspec actionmailer

我有一个UserMailDispatcher课程,其职责是根据特定条件通过ActiveMailer邮寄邮件。

我正在尝试使用RSpec对其进行测试,但即将推出。我想以某种方式存根测试邮件程序,看看该类是否正确传递它。这是我到目前为止所做的:

我的所有邮件程序都继承自ApplicationMailer:

application_mailer.rb

class ApplicationMailer < ActionMailer::Base
  append_view_path Rails.root.join('app', 'views', 'mailers')
end

user_mail_dispatcher_spec.rb

require 'rails_helper'

describe UserMailDispatcher do 
  class UserMailer < ApplicationMailer 
    def test_mail
      mail
    end
  end

  it "mails stuff" do
    ???
  end
end

我想测试调度程序是否可以正确排队/传递邮件。但是,我似乎无法拨打UserMailer.test_mail.deliver_now。我得到missing template 'user_mailer/test_mail'我尝试将type: :view添加到规范并使用stub_template 'user_mailer/test_mail.html.erb',但我得到了相同的错误。

我确实定义了UserMailer,但我不想在这里测试任何方法,因为这些方法更有可能发生变化。

有关如何最好地处理此问题的任何想法?

3 个答案:

答案 0 :(得分:2)

当我使用DummyMailer进行测试时,我也遇到了这个问题并且绕过它我只是要求mail方法返回这样的纯文本:

mail do |format|
  format.text { render plain: "Hello World!" }
end

这是documentation for it,向下滚动一下以找到正确的部分。

答案 1 :(得分:0)

Add the required template and test without stubbing by using ActionMailer::Base.deliveries. Here's an example (in minitest) from the guide (http://guides.rubyonrails.org/testing.html#testing-your-mailers).

require 'test_helper'

class UserMailerTest < ActionMailer::TestCase
  test "invite" do
    # Send the email, then test that it got queued
    email = UserMailer.create_invite('me@example.com',
                                     'friend@example.com', Time.now).deliver_now
    assert_not ActionMailer::Base.deliveries.empty?

    # Test the body of the sent email contains what we expect it to
    assert_equal ['me@example.com'], email.from
    assert_equal ['friend@example.com'], email.to
    assert_equal 'You have been invited by me@example.com', email.subject
    assert_equal read_fixture('invite').join, email.body.to_s
  end
end

答案 2 :(得分:0)

以下是如何测试使用正确参数调用邮件程序的方法。

it 'sends email' do
  delivery = double
  expect(delivery).to receive(:deliver_now).with(no_args)

  expect(UserMailer).to receive(:test_mail)
    .with('my_arguments')
    .and_return(delivery)

  UserMailDispatcher.my_function
end