Skip to content

Testing with VCR

Dario Leidi edited this page Aug 2, 2023 · 11 revisions

In our CI environment, we don't have the backend running and therefore we are using VCR to replay previous recorded HTTP sessions between frontend and backend.

VCR configuration

We have a configuration global named global_write_through which controls if data will be sent to backend or not. When set to true, data goes to the backend (therefore a backend is expected to be there up and running). This configuration is controlled in vcr.rb.

Simultaneously specs they use recorded cassettes have vcr: true (e.g. branch_package_spec.rb) defined in the Class description. When enabled, tests will make use of cassettes instead of considering using backend responses and data.

Important: do not run the whole suite with global_write_through enabled. Instead run just the specific spec needing a new cassette.

Run specs

Using VCR cassettes

With vcr: true set in the spec Class description, simply run the spec as normal:

rspec spec/models/workflow_spec.rb

Using the backend (bypassing VCR)

Make sure vcr: false is set in the spec Class description, then run the spec with the GLOBAL_WRITE_THROUGH prefix to override the one described in vcr.rb:

GLOBAL_WRITE_THROUGH=true rspec spec/models/workflow_spec.rb

Record

New cassette

Set default_cassette_options to :new_episodes instead of :once, then enable vcr: true in the spec file and run:

GLOBAL_WRITE_THROUGH=true rspec spec/models/workflow_spec.rb

With GLOBAL_WRITE_THROUGH enabled it will use the backend, but with vcr: true and :new_episodes it will record everything run by the spec to cassettes.

Update cassette

Same as #New cassette, but this time it will add the new episode recorded to the existing cassette instead.

Flushing the backend

In the process, of developing tests with cassettes, the backend doesn't get flushed between test runs. If cassettes are recorded without flushing the backend, they will contain responses from a backend filled up with previous data.

So, for example, when in your test you use a factory to create a package package1 with a file and run the test, a package with a file is created in the backend. If you modify the test to create a simple package package1 without a file, and run the test, the backend will keep the file attached to this package. And the rest of the code of your test will work as it was the first run, when it probably shouldn't.

To assure this doesn't happen when creating the cassettes, just delete the docker backend container, and wake up it again. This can be done with the following commands:

docker-compose rm -s -f backend
docker-compose up -d backend
Clone this wiki locally