2017-11-13 6 views
1

PactJSを使用してAngular Servicesの一部をテストしようとしています。私は使用しています:Angular 2/4/5でPactJSを使用してサービスをテストする方法

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

私は正常に実行するためのテストを得ることができません。非同期を使用しないと、サブスクライブコールバックは決してヒットしません。私が非同期を使用すると、Pactは失敗します。これは私のコードです:

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() 
     }); 
    }); 
    }); 
}); 

そして、私が取得エラー:

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. 

私はこれら二つのプロジェクト

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

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

は誰がするために管理しています、次のされていますPactJSをAngularまたはWhaで正常に実装する私はこの仕事を得るために行方不明ですか?

+1

Pactを使用してバックエンドをモックすると、HttpClientTestingModuleが使用され、HttpClientModuleは使用されないのはなぜですか?それはどちらか一方です。 'done.fail'は仕様に指定されていません。このような問題が発生するため、エラーを未解決のままにしないでください。 – estus

答えて

0

あなたのテスト構造はよく見えます。起こっていることを検証する1つの方法は、モックサーバーのログを確認することです。そのエラーメッセージはかなり明確です - それは期待していた要求を取得しませんでした。

HttpClientTestingModuleが実際に実際の呼び出しを行っていない場合、Pactは相互作用が予想されるので失敗します。これが、プロバイダが遵守する必要がある契約の詳細を確認する方法です。それが嘲笑された場合、私たちはリクエストを取得せず、あなたのコードが期待するものを確認することができません。

So.あなたのテストが実際に実際のHTTPコールを行っていることを確認してください。そして、実際のところ、モックサーバーに適切な順序で(ログをチェックすることによって)適切な詳細をヒットしていることを確認してください。

0

ここで指定されているエラーは、テストのタイムアウトが1つ(デフォルトは10秒)であるためです。タイムアウトしたために検証が失敗したためです。

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

はたぶん何かがgetGroups()に失敗し、キャッチされていないか、それが動作しません。実際にサブスクライブ:それは決して呼び出されません取得し、あなたの購読コールバックのように思えるので、私の提案は、具体的には、独自のコードでApiServiceを見ることです。どちらの方法でも、その関数は決してエンドポイントを呼び出すことはありません(検証ごとに)。コールバックは決して呼び出されませんでした。したがって、done()はコールされていませんでした。

関連する問題