Ожидаемое исключение, но ничего не было поднято Rails Mailer (метод повышения-исключения, похоже, не вызывается) - PullRequest
0 голосов
/ 22 апреля 2020

У меня RSpe c, которые ожидают возникновения какого-то исключения. Однако при вызове метода я получил ошибку: expected Exception but nothing was raised

мой код:

require 'rails_helper'

RSpec.describe ReportMailer, type: :mailer do
  let(:csv_file) { "data\n1\n2" }
  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

RSpe c показать ошибку / ошибку, которую я ожидаю раньше:

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 в методе уведомления и обнаружил, что: если мы используем expect блок, то есть expect.{...}.to, метод уведомления не выполняется. Но если мы используем обычный expect, то есть expect(...).to, выполняется метод уведомления.

Могу ли я знать, почему он так себя ведет? Потому что другие вопросы SO показали, что он работает с использованием блока ожидаемых.

Спасибо

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

Ответ, как прокомментировал @ amit-patel, нам нужно добавить deliver_now, чтобы действительно выполнить mailer RSpe c контрольный пример.

it 'should send email ' do
 expect { ReportMailer.notify(options, nil).deliver_now }.to raise_error(SomeExceptions::InvalidMailOptions)
end
0 голосов
/ 22 апреля 2020

В строке 5 вы вызываете SomeExceptions::InvalidFile исключение, в то время как вы ожидаете другую ошибку в блоке ожидания

raise_error(SomeExceptions::InvalidMailOptions)

, либо вы заменяете ожидаемое исключение, либо перехватываете все исключения, используя raise_error без Передача любого класса ошибок (не рекомендуется, но ради тестирования).

...