Vertragstest für einen Java-Konsumenten und JavaScript-Anbieter

Sep 01 2020

Wir haben 2 Dienste, bei denen einer der Verbraucher des anderen ist. Der Verbraucher ist in Java und der Anbieter in JavaScript geschrieben.

Auf der Verbraucherseite haben wir einen Verbrauchervertragstest mit pact-jvm definiert und können einen Vertrag erstellen. In diesem Vertrag ist die Antwort wie folgt definiert:

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

Bei unserem Provider versuchen wir nun, einen Provider-Vertragstest mit pact-js zu definieren, aber wir stoßen auf ein Problem, bei dem wir in pact-js a verwenden MessageProviderPact, um den Vertrag zu überprüfen. Beim Ausführen des Tests wird jedoch erwartet, dass sich der Textkörper in einem Inhaltsattribut wie dem folgenden befindet:

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

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

Code zur Überprüfung des Pakts

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

Irgendeine Idee, wie man das löst? Ist es möglich, eine ähnliche Nachrichtenstruktur mit Inhaltsschlüssel auf der Verbraucherseite zu verwenden? Oder können wir es auf der Anbieterseite anders lösen?

Antworten

MatthewFellows Sep 02 2020 at 06:58

MessageProviderPactist für Interaktionen vom Typ Nachrichtenwarteschlange, nicht für HTTP-Interaktionen. Ich denke du brauchst die Standardklasse Verifier(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
});