2016-12-21 11 views
5

@angular/httpに依存するコードをテストするのにMockBackendを使用しています。ウェブの周り
すべての例では、ここのような非同期のテスト・セットアップ、使用:
thoughtram: Testing Services with Http in Angular角度:MockBackendでHTTPをテストしていますが、async()は本当に必要ですか?

describe('getVideos()',() => { 

    it('should return an Observable<Array<Video>>', 
     async(inject([VideoService, MockBackend], (videoService, mockBackend) => { 

     videoService.getVideos().subscribe((videos) => { 
     expect(videos.length).toBe(4); 
     expect(videos[0].name).toEqual('Video 0'); 
     expect(videos[1].name).toEqual('Video 1'); 
     expect(videos[2].name).toEqual('Video 2'); 
     expect(videos[3].name).toEqual('Video 3'); 

     expect("THIS TEST IS FALSE POSITIVE").toEqual(false); 
     }); 

     const mockResponse = { 
     data: [ 
      { id: 0, name: 'Video 0' }, 
      { id: 1, name: 'Video 1' }, 
      { id: 2, name: 'Video 2' }, 
      { id: 3, name: 'Video 3' } 
     ] 
     }; 

     mockBackend.connections.subscribe((connection) => { 
     connection.mockRespond(new Response(new ResponseOptions({ 
      body: JSON.stringify(mockResponse) 
     }))); 
     }); 
    }))); 
}); 

をしかし、私はそれを試してみたと私はMockBackendが完全に同期を実行することをかなり確信している:

describe('getVideos()',() => { 

    it('should return an Observable<Array<Video>>', 
    inject([VideoService, MockBackend], (videoService, mockBackend) => { 

     const mockResponse = { 
     data: [ 
      { id: 0, name: 'Video 0' }, 
      { id: 1, name: 'Video 1' }, 
      { id: 2, name: 'Video 2' }, 
      { id: 3, name: 'Video 3' }, 
     ] 
     }; 

     mockBackend.connections.subscribe((connection) => { 
     connection.mockRespond(new Response(new ResponseOptions({ 
      body: JSON.stringify(mockResponse) 
     }))); 
     }); 

     let videos; 
     videoService.getVideos().subscribe(v => videos = v); 

     // synchronous code!? 
     expect(videos.length).toBe(4); 
     expect(videos[0].name).toEqual('Video 0'); 
     expect(videos[1].name).toEqual('Video 1'); 
     expect(videos[2].name).toEqual('Video 2'); 
     expect(videos[3].name).toEqual('Video 3'); 
    })); 
}); 

私はここplunkerの完全な例を作成しました: https://plnkr.co/edit/I3N9zL?p=preview

enter image description here

これらの記事が書かれたので、何かが変更されている必要があります。 誰かがその急変を私に指摘できますか?それとも、私は重要な事実を見逃しましたか?

+0

通行テストを変更して通行することは必ずしも有用ではありません。* asyncを使って*失敗したテストを行ってその通話を削除するとどうなりますか?それでも失敗しますか? – jonrsharpe

+0

最初の例は基本的には間違っています。 ''このテストは肯定的です。 '; toEqual(false); 'は決して緑色ではありません。コードが非同期で実行されるとうまくいくでしょう。それは(それ以上)ではありません。 –

+0

私は、*** mockResponse ***は同期ですが、*** MockConnection ***は同期していないようです。 2回目のテストを各テストに追加しました(これを2つのビデオに減らし、同期の1つは失敗し、非同期は成功しました)。 –

答えて

5

あなたは完全に正しいと思いますが、MockConnection.mockRespond()は同期して出力されます。 async()は、この特定のテストでは必要ありません。

私はあなたの質問であなたが参照した記事の著者であり、それに応じてそれを更新しました。

ありがとうございました!

関連する問題