lundi 29 mars 2021

(RSpec) How do I check if an object is created?

I want to test if expected exception handling is taking place in the following Ruby code through RSpec. Through testing I realized that I cannot use the raise_error matcher to test if the exception was raised, after rescuing it.

So, now I want to test whether objects of CustomError and StandardError are created to see if the error was raised as expected.

test.rb

module TestModule
  class Test
    class CustomError < StandardError
    end

    def self.func(arg1, arg2)
      raise CustomError, 'Inside CustomError' if arg1 >= 10 && arg2 <= -10
      raise StandardError, 'Inside StandardError' if arg1.zero? && arg2.zero?
    rescue CustomError => e
      puts 'Rescuing CustomError'
      puts e.exception
    rescue StandardError => e
      puts 'Rescuing StandardError'
      puts e.exception
    ensure
      puts "arg1: #{arg1}, arg2: #{arg2}\n"
    end
  end
end

test_spec.rb

require './test'

module TestModule
  describe Test do
    describe '#func' do
      it 'raises CustomError when arg1 >= 10 and arg2 <= -10' do
        described_class.func(11, -11)
        expect(described_class::CustomError).to receive(:new)
      end
    end
  end
end

When I run the above code I get the following error

 Failures:

  1) TestModule::Test#func raises CustomError when arg1 >= 10 and arg2 <= -10
     Failure/Error: expect(described_class::CustomError).to receive(:new)
     
       (TestModule::Test::CustomError (class)).new(*(any args))
           expected: 1 time with any arguments
           received: 0 times with any arguments
     # ./test_spec.rb:8:in `block (3 levels) in <module:TestModule>'

The idea was that if CustomError is being raised, it's obejct must be created using new and I can test that using RSpec. However, as you can see, this isn't working.

What am I missing?

Is there a better approach?

Aucun commentaire:

Enregistrer un commentaire