【问题标题】:NoMethodError: undefined method `assert_emails' in controller testNoMethodError:控制器测试中未定义的方法“assert_emails”
【发布时间】:2017-02-14 10:49:33
【问题描述】:

根据Rails documentationassert_emails 方法允许转换语法:

assert_difference ->{ ActionMailer::Base.deliveries.size }, +1 do
  post :method_that_should_send_email
end

assert_emails 1 do
  post :method_that_should_send_email
end

我觉得更好,因为我不必每次都复制粘贴长语法。

但是,在使用上述代码时,我的控制器测试中出现以下错误:

NoMethodError: undefined method `assert_emails'

我认为这是因为该方法仅在邮件测试中可用。

有没有办法让它也可用于控制器测试?有充分的理由说明默认情况下不可用吗?有没有更好的方法来测试调用特定路由是否会导致发送电子邮件?

谢谢。

【问题讨论】:

    标签: ruby-on-rails testing ruby-on-rails-5


    【解决方案1】:

    我在常规测试中尝试使用assert_emails(不是ActionMailer::TestCase)时遇到了同样的问题。

    当我将ActionMailer::TestHelper 包含到我的测试类中时,助手开始工作。

    class FooTest < ActiveSupport::TestCase
      include ActionMailer::TestHelper
    
      test '...' do
        assert_no_emails do
          # ...
        end
      end
    end
    

    我相信这也应该适用于您的控制器测试。

    【讨论】:

    • 这也适用于Rspec.describe 线下
    【解决方案2】:

    ** 使用 Deliver_later **

    如果有人使用deliver_later 发送电子邮件,那么他可以使用以下代码对其进行测试

    include ActionMailer::TestHelper
    
    test 'test deliver later' do
      assert_enqueued_emails 1 do
        ---code which runs deliver later--
      end
    
    # Check the mailer name
      enqueued_jobs.first[:args][1] = 'my_mailer_method'
    end
    

    【讨论】:

      猜你喜欢
      • 2022-11-05
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 2019-12-29
      • 2013-10-03
      • 1970-01-01
      相关资源
      最近更新 更多