Test del contratto per un consumatore Java e un provider JavaScript

Sep 01 2020

Abbiamo 2 servizi in cui uno è il consumatore dell'altro. Il consumatore è scritto in Java e il provider è scritto in JavaScript.

Dal punto di vista del consumatore abbiamo definito un test del contratto con il consumatore utilizzando pact-jvm e siamo in grado di generare un contratto. In questo contratto la risposta è definita come:

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

Sul nostro provider stiamo ora cercando di definire un provider-contract-test usando pact-js ma stiamo riscontrando un problema in cui in pact-js stiamo usando a MessageProviderPactper verificare il contratto. Ma quando si esegue il test, il corpo dovrebbe essere in un attributo di contenuto come questo:

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

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

Codice utilizzato per la verifica del patto

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

Qualche idea su come risolverlo? È possibile utilizzare una struttura di messaggio simile con la chiave del contenuto dal lato del consumatore? Oppure possiamo risolverlo in altro modo dal lato del provider

Risposte

MatthewFellows Sep 02 2020 at 06:58

MessageProviderPactè per le interazioni di tipo coda di messaggi, non per le interazioni HTTP. Penso che tu abbia bisogno della Verifierclasse standard (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
});