Ruby · 23 Sep 2021

RSpec - How to chain .to change matcher in rubocop

If you use rubocop and want to chain [.to change] matcher, it can be quite confusing.

Here is how you should do it correctly:

subject(:service_call) { my_service.call(car_id: id) }

let(:car) { create :car }

it "passes test" do
  expect { service_call }.to(
    change { car.brand }.to("Opel")
      .and(change { car.model }.to("Astra")
      .and(change { car.production_year }.to(1997),
  )
end
Ruby · 23 Jun 2021

How to test raise_error matcher if it gets an error

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:

Read more