Prueba de contrato para un consumidor de Java y un proveedor de JavaScript

Sep 01 2020

Contamos con 2 servicios donde uno es consumidor del otro. El consumidor está escrito en Java y el proveedor está escrito en JavaScript.

En el lado del consumidor, hemos definido una prueba de contrato de consumidor usando pact-jvm y podemos generar un contrato. En este contrato la respuesta se define como:

"response": {
  "status": 200,
  "headers": {
    "Content-Type": "application/json"
  },
  "body": [
    "test"
  ]
},

En nuestro proveedor, ahora estamos tratando de definir una prueba de contrato de proveedor usando pact-js, pero tenemos un problema en el que en pact-js estamos usando a MessageProviderPactpara verificar el contrato. Pero al ejecutar la prueba, se espera que el cuerpo esté en un atributo de contenido como este:

Key: - is expected 
            + is actual 
       Matching keys and values are not shown

       -[
       -  "test"
       -]
       +{
       +  "contents": {
       +    "statusCode": 200,
       +    "body": "[test]"
       +  }
       +}

Código utilizado para la verificación del pacto

const p = new MessageProviderPact({
        messageProviders: {
            '': handler
        },
        provider: 'provider-service',
        pactUrls: [
            path.resolve(
                process.cwd(),
                'pacts',
                'consumer-service-provider-service.json'
            )
        ]
    });

¿Alguna idea de cómo solucionar esto? ¿Es posible utilizar una estructura de mensaje similar con una clave de contenido en el lado del consumidor? ¿O podemos resolverlo de otra manera por parte del proveedor?

Respuestas

MatthewFellows Sep 02 2020 at 06:58

MessageProviderPactes para interacciones de tipo de cola de mensajes, no para interacciones HTTP. Creo que necesitas la Verifierclase estándar (https://github.com/pact-foundation/pact-js/#provider-api-testing):

const { Verifier } = require('@pact-foundation/pact');
let opts = {
  ...
};

new Verifier(opts).verifyProvider().then(function () {
    // do something
});