/ Ruby on Rails

Validadores personalizados de VCR en Rails

De forma predeterminada los validadores de VRC exigen regenerar el cassette creado solamente cuando se cambia la URL o método HTTP. Si queremos validar el cuerpo de la petición o encabezados, habrá que especificarlo explícitamente:

context 'my context', vcr: { match_requests_on: [:uri, :method, :body, :query, :headers] }  do
  it 'does something' do
     # ...
  end
end

¿Pero qué hacer si alguno de los parámetros que pasamos en el cuerpo de la petición es dinámico? Por ejemplo, el identificador de una transacción o de un objeto. En este caso podemos escribir en el archivo vcr_setup.rb nuestro propio emparejador con sus propias reglas:

require 'vcr'
require 'json'

VCR.configure do |c|
  c.register_request_matcher :body_matcher do |request_1, request_2|
    body1, body2 = request_1.body, request_2.body

    begin
      body1, body2 = JSON.parse(body1), JSON.parse(body2)
    rescue JSON::ParserError
      body1 == body2
    else
      if request_1.uri == request_2.uri
        if request_1.uri.include?('api/charge/credit_card')
          body1.delete('unique_transfer_token')
          body2.delete('unique_transfer_token')
        end
      end
      body1 == body2
    end
  end
end

El validador que escribimos toma dos cuerpos de nuestra petición - el del cassette y el que se está generando por la prueba - y los compara, pero antes de hacer eso, excluye del body la llave unique_transfer_token. Lo hacemos sólo para las peticiones a la URL api/charge/credit_card.

Ahora podemos reescribir el listado de validadores para la prueba, usando nuestro emparejador personalizado :body_matcher:

context 'my context', vcr: { match_requests_on: [:uri, :method, :body_matcher, :query, :headers] }  do
  it 'does something' do
     # ...
  end
end