预期为Exception,但未引发任何Rails-Mailer(似乎未调用引发异常的方法)



我有一个RSpec,它希望引发一些异常。然而,在调用该方法时,我得到了错误:expected Exception but nothing was raised

我的代码:

require 'rails_helper'
RSpec.describe ReportMailer, type: :mailer do
let(:csv_file) { "datan1n2" }
let(:filename) { 'dummy.csv' }
let(:options) do
{
filename: filename,
to: user.email,
subject: "Transaction Report - #{filename}"
}
end
it 'raise error' do
expect do
ReportMailer.notify(options, nil)
end.to raise_error(SomeExceptions::InvalidFile)
end
end

问题是,如果我只使用普通的expect调用,比如

expect(described_class.notify(dummy_options, nil)).to eq 1

RSpec显示我之前预期的故障/错误:

Failures:
1) ReportMailer raise error
Failure/Error: raise SomeExceptions::InvalidFile
SomeExceptions::InvalidFile:
The file is invalid
# ./app/mailers/report_mailer.rb:5:in `notify'
# ./spec/mailers/report_mailer_spec.rb:37:in `block (2 levels) in <top (required)>'

我的通知方法如下:

require 'some_cms_exceptions'
class ReportMailer < ApplicationMailer
def notify(options, csv)
binding.pry
raise SomeExceptions::InvalidFile
validate(options)
attachments[options[:filename]] = { mime_type: 'text/csv', content: csv }
mail(to: options[:to], subject: options[:subject])
end
private
def validate(options)
raise SomeExceptions::InvalidMailOptions unless !options[:to].blank? && !options[:filename].blank?
end
end

然后我把binding.pry放在notify方法中,发现:如果我们使用expect块,即expect.{...}.to,则不执行通知方法。但如果我们使用普通的expect,即expect(...).to,则执行通知方法。

我能知道它为什么会这样吗?因为其他SO问题表明它通过使用期望块来工作。

谢谢

在第5行,当您在预期块中预期不同的错误时,您将引发SomeExceptions::InvalidFile异常

raise_error(SomeExceptions::InvalidMailOptions)

要么替换预期的异常,要么只使用raise_error捕获所有异常,而不传递任何错误类(不推荐使用,但出于测试目的(。

答案是@amit-patel评论的,我们需要添加deliver_now才能真正执行mailerRSpec测试用例。

it 'should send email ' do
expect { ReportMailer.notify(options, nil).deliver_now }.to raise_error(SomeExceptions::InvalidMailOptions)
end

相关内容

  • 没有找到相关文章

最新更新