2017-04-21 12 views
0

サービスをテストする必要がある次のangular(4)テストがありますが、Observableが返す前に通過していると思われ、expect getがヒットします。非同期呼び出しが完了する前に角度テストが終了していますか?

it('should enter the assertion', inject(
     [ MockBackend, CellService ], 
     (backend: MockBackend, s: CellService) => { 
      const urls = []; 

      backend.connections.subscribe((connection: MockConnection) => { 
       const req = connection.request; 
       urls.push(req.url); 
       if (req.method === RequestMethod.Get && req.url === '/api/getTest') { 
        connection.mockRespond(new Response(new ResponseOptions('enter mocked content'))); 
       } 
      }); 
      s.getCell('powders').subscribe(val => expect(true).toBeFalsy()) 
     }) 
    ); 

私はasync/awaitを追加しようとしましたが、違いはありませんでした。これどうやってするの?

更新:これはテストゾーンにテストをラップします

it('should enter the assertion', async(inject(
    [ MockBackend, CellService ], 
    (backend: MockBackend, s: CellService) => { 
     const urls = []; 

     backend.connections.subscribe((connection: MockConnection) => { 
      const req = connection.request; 
      urls.push(req.url); 
      if (req.method === RequestMethod.Get && req.url === '/api/getTest') { 
       connection.mockRespond(new Response(new ResponseOptions('enter mocked content'))); 
      } 
     }); 
     s.getCell('powders').subscribe(val => expect(true).toBeFalsy()) 
    }) 
)); 

答えて

2

ラップ角度のasync

import { async } from '@angular/core/testing'; 

         ---==== vvvv ===---- 
it('should enter the assertion', async(inject(
    [ MockBackend, CellService ], 
    (backend: MockBackend, s: CellService) => { 
     ... 
    }) 
)); 

でのテストこのコードはあまりにも合格

...、できるようになりますテストを終了する前にすべての非同期タスクが完了するのを実際に待つ角度。

も参照してください:

UPDATE

でそれを試してみてくださいfakeAsycn/tick

import { fakeAsync } from '@angular/core/testing'; 

it('should enter the assertion', fakeAsync(inject(
    [ MockBackend, CellService ], 
    (backend: MockBackend, s: CellService) => { 
     ... 

     let value; 
     s.getCell('powders').subscribe(val => { 
      value = val; 
     }) 
     tick(); 
     expect(val).toBeTruthy(); 
    }) 
)); 

それはずasyncとの仕事が、すべてのものが同期しているため、デバッグにそれが少し楽になりfakeAsyncを使用。

まだ動作しない場合は、ロジックを他の場所で確認する必要があります。私が作る小切手の1つがここにあります

req.method === RequestMethod.Get && req.url === '/api/getTest' 

これらの両方が合格していますか?そうでなければ、応答はありません。

+0

として行わパスが、私はこのアプローチを試してみましたが、まだ期待される動作を見ていないです、私は何か間違ったことをしたのでしょうか。 –

+0

私の更新を見てください。条件が満たされていることを確認します。そうでなければ、応答はありません。 –

0

ここではJasmine done()コールバックを使用することをお勧めします。

まず、仕様のインジェクタを取り外し、TestBed.get(serviceToken)beforeEachセクションに使用します。

第二に、私の更新の質問を参照してください仕様関数のパラメータ

it('should use asynchronous', done => { 
    s.method().subscribe(result => { 
    expect(result).toBe(...); 
    done(); 
    } 
}) 
関連する問題