2016-06-29 8 views
3

私は角度2のプロジェクトと角度付きのサービスを作成し、サービスをテストしようとしました。angular2テストフレームワークの非同期テストの問題

しかし、APIは非同期機能では失敗しませんが、その例外を無視するだけです。

/* tslint:disable:no-unused-variable */ 

import { 
    beforeEach, beforeEachProviders, describe, xdescribe, 
    expect, it, xit, async, inject, injectAsync 
} from '@angular/core/testing'; 
import { SearchService } from './search.service'; 
import {provide} from '@angular/core'; 
import {MockBackend, MockConnection} from '@angular/http/testing'; 
import {XHRBackend, Response, ResponseOptions, HTTP_PROVIDERS} from '@angular/http'; 

describe('Search Service',() => { 
    let searchService: SearchService; 
    let mockBackend: MockBackend; 

    beforeEachProviders(() => [ 
    HTTP_PROVIDERS, 
    MockBackend, 
    provide(XHRBackend, { useClass: MockBackend }), 
    SearchService 
    ]); 

    beforeEach(injectAsync([SearchService, MockBackend], (s, m) => { 
    searchService = s; 
    mockBackend = m; 
    })); 

    it('async test',() => { 
    setTimeout(() => { 
     expect(2).toBe(1); 
    }, 3000); 
    }); 

これらの最小テストケースは無視されます。

私はいくつかのドキュメントを読んで、私のコードを次のように更新しました。

it('async test with done', (done) => { 
    setTimeout(() => { 
    expect(1).toBe(1); 
    done(); 
    }, 1000); 
}); 

今回は、テストは失敗しますが、今回は失敗します。エラーは次のとおりです。

エラー:タイムアウト - jasmine.DEFAULT_TIMEOUT_INTERVALで指定されたタイムアウト内に非同期コールバックが呼び出されませんでした。

デフォルトのタイムアウト値をより大きな値に変更しますが、効果がありません。

+1

何Angular2バージョンを使用していますか? –

+0

そのバージョンは2.0.0-rc.3 –

答えて

6

injectAsyncasyncを使用し、動作しませんがinjectAsyncが廃止され

angular2 change log beta 16

(RC2後に私のために働いて停止しました)。代わりに、非同期テストをラップするにはasync関数を使用します。 カルマやその他のテスト設定では、依存ファイル 'node_modules/zone.js/dist/async-test.js'をサービスファイルとして追加する必要があります。後

it('should wait for returned promises', injectAsync([FancyService], (service) => { 
    return service.getAsyncValue().then((value) => { expect(value).toEqual('async value'); }); 
})); 
it('should wait for returned promises', injectAsync([],() => { 
    return somePromise.then(() => { expect(true).toEqual(true); }); 
})); 

::前

it('should wait for returned promises', async(inject([FancyService], (service) => { 
    service.getAsyncValue().then((value) => { expect(value).toEqual('async value'); }); 
}))); 
// Note that if there is no injection, we no longer need `inject` OR `injectAsync`. 
it('should wait for returned promises', async(() => { 
    somePromise.then(() => { expect(true).toEqual(true); }); 
})); 
+0

質問の更新によって回答を更新できますか? –

+0

すばらしい答え、ありがとう@robert – sebaferreras