8

私は、サーバーからデータを取得し、複数の要求を作成してオブザーバブルの配列を返すデータサービスを用意しています。私はそのデータをテストしたい。複数の呼び出しを行い、応答をマッピングせずにobservableを返すHTTPサービスのテスト

私は何をやってみたのかは、データをテストする正しい方法があるかどうかわかりませんが、2つの観測値を含む配列を送信しました。

しかし、テストでは、非同期テストブロック

重要で、特に最後の3つのテストを失敗している:観測可能に加入、間に合わないメソッドを呼び出し、falsyするfalsyとcomicsIdするcharIdを設定するとき、私は、それをテストしたいですhttpを嘲笑した後、2つの期待される応答を含む配列が返されます。 charIdが真実ならば、期待される4つの応答と同じです。 6つの期待される応答のための同じcomicsIdがtruthyある

//データをフェッチサービス

getChar(): Observable<any> { 

    const Observables = []; 
    Observables.push(this.http.get('https://gateway.marvel.com:443/v1/public/characters?apikey')); 
    Observables.push(this.http.get('https://gateway.marvel.com:443/v1/public/comics?apikey')); 

    if (this.charId) { 
     Observables.push(this.http.get(`${this.urlChar}${this.charId}${this.apiKey}`)); 
     Observables.push(this.http.get(`${this.urlChar}${this.charId}/comics${this.apiKey}`)); 
    } 
    if (this.comicsId) { 
     Observables.push(this.http.get(`${this.urlCom}${this.comicsId}${this.apiKey}`)); 
     Observables.push(this.http.get(`${this.urlCom}${this.comicsId}/creators${this.apiKey}`)); 
    } 
    console.log([Observable, Observable]); 
    return Observable.forkJoin(Observables); 
    } 
} 

//すべての私のテスト

import { async, ComponentFixture, TestBed, getTestBed, inject } from '@angular/core/testing'; 
import { MockBackend, MockConnection } from '@angular/http/testing'; 
import { DataService } from './data.service'; 
import { 
    BaseRequestOptions, Http, XHRBackend, HttpModule, 
    Response, ResponseOptions, RequestMethod 
} from '@angular/http'; 
import { Observable } from 'rxjs/Observable'; 

describe('DataService',() => { 
    let mockBackend: MockBackend; 

    beforeEach(async(() => { 
    TestBed.configureTestingModule({ 
     providers: [ 
     DataService, 
     MockBackend, 
     BaseRequestOptions, 
     { 
      provide: Http, 
      deps: [MockBackend, BaseRequestOptions], 
      useFactory: 
      (backend: XHRBackend, defaultOptions: BaseRequestOptions) => { 
      return new Http(backend, defaultOptions); 
      } 
     } 
     ], 
     imports: [ 
     HttpModule 
     ] 
    }); 
    mockBackend = getTestBed().get(MockBackend); 
    })); 


    it('should get ObservableArr', (done) => { 
    let dataService: DataService; 

    getTestBed().compileComponents().then(() => { 
     mockBackend.connections.subscribe(
     (connection: MockConnection) => { 
      connection.mockRespond(new Response(
      new ResponseOptions({ 
       body: [Observable, Observable] 
      } 
      ))); 
     }); 

     dataService = getTestBed().get(DataService); 
     expect(DataService).toBeDefined(); 

     dataService.getChar().subscribe((obsArr: Observable<any>[]) => { 
     expect(obsArr.length).toBeDefined(); 
     expect(obsArr.length).toEqual(2); 
     expect(obsArr.length).not.toBe(1); 
     done(); 
     }); 
    }); 
    }); 


    it('should check the service', 
    inject([DataService], (service: DataService) => { 
     expect(service).toBeTruthy(); 
    })); 

    it('should get ObservableArray async', 
    async(inject([DataService], (dataService: DataService) => { 
     mockBackend.connections.subscribe(
     (connection: MockConnection) => { 
      connection.mockRespond(new Response(
      new ResponseOptions({ 
       body: [Observable, Observable] 
      } 
      ))); 
     }); 
     dataService.getChar().subscribe(
     (response) => { 
      expect(response.length).toBe(2); 
      expect(response[0]).toBe(Observable); <<<<<<<<<<<<<< Fails 
      expect(response[1]).toBe(Observable); <<<<<<<<<<<<<< Fails 
      expect(response).toEqual([Observable, Observable]); <<<<<< Fails 
     }); 
    }))); 
}); 
+2

'forkJoin'がどのように動作するか誤解しているかもしれません。それはオブザーバブルを返さず、各コンポーネントオブザーバブルから実際の結果を返します。しかし、私はまだ答えを提供するために十分なテストに精通していないと言っている。 –

+0

デバッグ用に最小のgit repoを提供できますか? –

+0

はい私は分を与えることができます – SONGSTER

答えて

1

まず、@Aviad P.は指摘として、forkJoinメソッドはObservableのオブザーバブル配列を返しません...それはforkJoin内のすべてのオブザーバブルの結果の配列を返し、そのオブザーバブルの結果はObservablesインスタンスではありません。

また、httpコールではすべてを嘲笑しているモックバックエンドでgetChart()メソッドをモックしませんが、getChar()メソッド自体はモーグではありません。配列は長さ=== 2でなければならないので、this.chartIdとthis.comicsIdは存在しません。

返される構造体はそういうものなので、レスポンス[0]は配列です:

誰配列が作成された新しい配列に等しくないだろうので
response = [[Observable, Observable], [Observable, Observable]] 

これは期待する、と言ったが、真なることはありません:

expect(response).toEqual([Observable, Observable]) 

はあなたの問題を解決する必要があり、そのすべてを変更します。また、あなたのオブザーバブルが返され、Observableインスタンスのコード: 'body:[Observable、Observable]'がObservablesインスタンスを返さない場合、Observable定義関数を返しています。 。

これはもののため試験例だろうが失敗している:

const mockResponse = {isMockResponse: true}; 

it('should get ObservableArray async', 
async(inject([DataService], (dataService: DataService) => { 
    mockBackend.connections.subscribe(
    (connection: MockConnection) => { 
     connection.mockRespond(new Response(
     new ResponseOptions({ 
      body: {...mockResponse} 
     } 
     ))); 
    }); 
    dataService.getChar().subscribe(
    (response) => { 
     expect(response.length).toBe(2); 
     expect(response[0].isMockResponse).toBe(true); <<< Is this expect really necessary? 
     expect(response[1].isMockResponse).toBe(true); <<< Is this expect really necessary? 
    }); 
}))); 

のみご利用の場合は、このもので、そのテストを期待して、と言った:

expect(response.length).toBe(2); 

他のものがありますあなたが嘲笑しているデータをテストしていないので、変数this.chartIdとthis.comicsIsの値のために実行されたコールのコール数をテストします。

これが役に立ちます。

+0

それを使わないでテストを書くことができますか?それを実行することはできません – SONGSTER

+0

私は理解しません。どういう意味ですか? @SONGSTER –

+0

あなたはコード – SONGSTER

関連する問題