Search code examples
ruby-on-railsrspecrspec-rails

Expected Exception but nothing was raised Rails Mailer (the raising-exception method seems not to be called)


I'm having RSpec which expect some exception to be raised. However, when invoking the method, I got error: expected Exception but nothing was raised

my code:

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

The problem is that if I just use normal expect call, let's say

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

RSpec show failure/error that I expect before:

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)>'

My notify method is below:

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

I then put binding.pry in notify method and found out that: if we use expect block, i.e. expect.{...}.to, notify method is not executed. But if we use normal expect, i.e. expect(...).to ,notify method is executed.

May I know why it behaves like this ? Because other SO questions showed it works by using expect block.

Thank you


Solution

  • At line 5 you are raising SomeExceptions::InvalidFile exception while you are expecting different error in the expectation block

    raise_error(SomeExceptions::InvalidMailOptions)
    

    either you replace the exception you are expected or catch all exception using just raise_error without passing any error class(not recommended but for sake of testing).