The problem with raise_error matcher in RSpec is common and it can be fixed in easy way.
Let's say we have situation like below:
subject(:service_call) { CarService.call }
it { expect(service_call).to raise_error(CarDatabaseConnectionError) }
If we call it like this it will get us an error.
1) CarUpdateService when fail
Failure/Error: raise CarDatabaseConnectionError
CarDatabaseConnectionError:
Can't connect with a custom car database.
Why it didn't pass the spec?
The problem is here:
expect(service_call)
If we call the subject in parentheses it will read full service in the beginning and it won't even check our matcher.
The resolution is to call our subject as a block:
subject(:service_call) { CarService.call }
it { expect { service_call }.to raise_error(CarDatabaseConnectionError) }
If we do it like this, our test will pass withour problem :)