我有一个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
,但我不想在这里测试任何方法,因为这些方法更有可能发生变化。
有关如何最好地处理此问题的任何想法?
答案 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