2017-11-13 7 views
1

Ich versuche PactJS zu benutzen, um einige meiner Angular Services zu testen. Ich verwende:Wie benutze ich PactJS mit Angular 2/4/5 um Dienste zu testen

"@pact-foundation/karma-pact": "^2.1.1", 
"pact": "^4.2.1", 
"pact-web": "^4.2.1", 

Ich kann den Test nicht erfolgreich ausgeführt werden. Ohne Async wird der Subskriptions-Callback niemals ausgelöst und wenn ich Async verwende, schlägt Pact fehl. Dies ist mein Code:

import { TestBed, async, inject } from '@angular/core/testing'; 
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; 
import { ApiService } from '../index'; 
import { HttpParams } from '@angular/common/http'; 
import { Group } from '../../grouping/model'; 
let Pact = require('pact-web'); 

describe('ApiService',() => { 

    let provider; 

    beforeAll((done) => { 
    provider = Pact({ 
     consumer: 'client', 
     provider: 'server', 
     web: true 
    }); 

    // required for slower CI environments 
    setTimeout(done, 2000); 

    // Required if run with `singleRun: false` 
    provider.removeInteractions(); 
    }); 

    afterAll((done) => { 
    provider.finalize().then(done, e => done.fail(e)); 
    }); 

    beforeEach(async(() => { 
    TestBed.configureTestingModule({ 
     imports: [ 
     HttpClientTestingModule 
     ], 
     providers: [ 
     ApiService 
     ] 
    }); 
    })); 

    afterEach((done) => { 
    provider.verify().then(done, e => done.fail(e)); 
    }); 

    describe('Get all Groups',() => { 

    beforeAll((done) => { 
     provider.addInteraction({ 
     given: 'groups exist', 
     uponReceiving: 'a request to get groups', 
     withRequest: { 
      method: 'GET', 
      path: '/api/groups' 
     }, 
     willRespondWith: { 
      status: 200, 
      headers: {'Content-Type': 'application/json'}, 
      body: [{ 
      id: Pact.Matchers.somethingLike(1), 
      name: Pact.Matchers.somethingLike('a group name'), 
      disabled: Pact.Matchers.somethingLike(false), 
      }] 
     } 
     }).then(done, e => done.fail(e)); 
    }); 

    it('should return all groups from API', (done) => { 

     const apiService: ApiService = TestBed.get(ApiService); 
     const groups: Group[] = [{ 
     id: 1, 
     name: false, 
     disabled: false 
     }]; 

     apiService.getGroups().subscribe((response: Group[]) => { 
     expect(response).toEqual(groups); 
     done() 
     }); 
    }); 
    }); 
}); 

Und die Fehler, die ich erhalten:

Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL. 

Failed: Actual interactions do not match expected interactions for mock MockService. 

Missing requests: 
    GET /api/groups 

See standard out/err for details. 

ich diese beiden Projekte

https://paucls.wordpress.com/2017/08/04/pact-consumer-driven-contract-implementation-in-angular/

https://github.com/koelec/angular-pact-example

Hat jemand verfolgt haben es geschafft, erfolgreich PactJS mit Angular oder WhA implementieren Ich vermisse es, dass das funktioniert?

+1

In Anbetracht, dass Pact verwendet wird, um das Backend zu verspotten, warum wird HttpClientTestingModule verwendet und nicht HttpClientModule? Es ist entweder das eine oder das andere. 'done.fail' ist nicht für die Spezifikation angegeben. Lassen Sie die Fehler niemals unberücksichtigt, da sie zu Problemen wie diesem führen. – estus

Antwort

0

Ihre Teststruktur sieht gut aus. Eine Möglichkeit, um zu überprüfen, was passiert, ist die Überprüfung der Protokolle für den Mock-Server. Diese Fehlermeldung ist ziemlich klar - es wurde keine Anfrage erwartet.

Wenn HttpClientTestingModule nicht wirklich aufruft, schlägt Pact fehl, da es eine Interaktion erwartet - so bestätigen wir die Details des Vertrags, den der Provider erfüllen muss. Wenn es verspottet wird, erhalten wir die Anfrage nicht und können Ihre Code-Anrufe nicht bestätigen, was Sie erwarten.

So. Stellen Sie sicher, dass Ihre Tests tatsächlich einen echten HTTP-Aufruf ausführen, und überprüfen Sie, ob sie tatsächlich den Mock Server in der richtigen Reihenfolge mit den richtigen Details treffen (indem Sie die Protokolle überprüfen).

0

Der Fehler, der hier angegeben wird, liegt speziell daran, dass einer Ihrer Tests fehlgeschlagen ist (Standard ist 10 Sekunden), die Überprüfung war danach aufgrund dieses Zeitüberschreitungstests fehlgeschlagen. Mein Vorschlag ist, in Ihrem eigenen Code, den ApiService speziell zu sehen, weil es wie Ihr abonnieren Rückruf scheint nie aufgerufen wird:

apiService.getGroups().subscribe((response: Group[]) => { 
     expect(response).toEqual(groups); 
     done() 
     }); 

Vielleicht nicht etwas in getGroups() und nicht gefangen oder dass abonniert tatsächlich nicht funktioniert . In jedem Fall hat diese Funktion niemals den Endpunkt aufgerufen (wie bei der Verifizierung) und der Callback wurde nie aufgerufen, daher wurde die Zeitüberschreitung seit done() nie aufgerufen.

Verwandte Themen