こんにちは、Angular2、Karma、Jasmineは比較的新しいです。今、私は機能をテストしたいユニットテストRxJS Observable.timer(typescript、karma、jasmineを使用)
getDataFromDb() { return Observable.timer(0, 2000).flatMap(() => {
return this.http.get(this.backendUrl)
.map(this.extractData)
.catch(this.handleError);
});
}
:現在、私は、私は定期的にこのようなHTTPサービスを呼び出す角度2サービスを持って角度2 RC4ジャスミン2.4.xの を使用しています。テストの目的のために私はちょうど行うことでObservable.timerずに別の機能に「http.get」をテストしています
const mockHttpProvider = {
deps: [MockBackend, BaseRequestOptions],
useFactory: (backend: MockBackend, defaultOptions: BaseRequestOptions) => {
return new Http(backend, defaultOptions);
}
}
describe('data.service test suite',() => {
var dataFromDbExpected: any;
beforeEachProviders(() => {
return [
DataService,
MockBackend,
BaseRequestOptions,
provide(Http, mockHttpProvider),
];
});
it('http call to obtain data',
inject(
[DataService, MockBackend],
fakeAsync((service: DataService, backend: MockBackend) => {
backend.connections.subscribe((connection: MockConnection) => {
dataFromDbExpected = 'myData';
let mockResponseBody: any = 'myData';
let response = new ResponseOptions({ body: mockResponseBody });
connection.mockRespond(new Response(response));
});
const parsedData$ = service.getDataFromDb()
.subscribe(response => {
console.log(response);
expect(response).toEqual(dataFromDbExpected);
});
})));
});
が、私は明らかにObservable.timerと全体の機能をテストしたいです。私はrxjsフレームワークのTestSchedulerを使いたいと思うかもしれませんが、x回だけタイマ関数を繰り返すように指示する方法はありますか?私はタイプコピーの文脈でそれを使用しているドキュメントを見つけることはできません。
編集:私が使用しているrxjs 5ベータ6
編集:あなたは内部のタイマーメソッドにTestSchedulerを注入する必要がある
describe('when getData',() => {
let backend: MockBackend;
let service: MyService;
let fakeData: MyData[];
let response: Response;
let scheduler: TestScheduler;
beforeEach(inject([Http, XHRBackend], (http: Http, be: MockBackend) => {
backend = be;
service = new MyService(http);
fakeData = [{myfake: 'data'}];
let options = new ResponseOptions({ status: 200, body: fakeData });
response = new Response(options);
scheduler = new TestScheduler((a, b) => expect(a).toEqual(b));
const originalTimer = Observable.timer;
spyOn(Observable, 'timer').and.callFake(function (initialDelay, dueTime) {
return originalTimer.call(this, initialDelay, dueTime, scheduler);
});
}));
it('Should do myTest', async(inject([],() => {
backend.connections.subscribe((c: MockConnection) => c.mockRespond(response));
scheduler.schedule(() => {
service.getMyData().subscribe(
myData => {
expect(myData.length).toBe(3,
'should have expected ...');
});
}, 2000, null);
scheduler.flush();
})));
});
で作業する必要があり、それを変更しました。 TestSchedulerはコンストラクタ内にassertDeepEqualを想定しています。[link](https://github.com/ReactiveX/rxjs/blob/master/src/testing/TestScheduler.ts)を参照してください。私は少し混乱していますが、私はTestSchedulerの作成で何を主張すべきですか? – stevehin
アサーション・フレームワーク(ジャスミン)のディープ・イコライゼーション・アサーション関数を渡す必要があるようです。 'new TestScheduler((a、b)=> expect(a).toEqual(b))' –
これは以前のものだったので、近づいてきました。スケジューラのスケジュールを設定したいときは、scheduleAbsoluteが[schedule](https://github.com/ReactiveX/rxjs/blob/master/src/scheduler/VirtualTimeScheduler.ts)に置き換えられました。 ()スケジューラのスケジューリング(null、2000、()=> {dataService.getDataFromDb()。サブスクリプション(レスポンス=> {期待(応答).toEqual(getVehiclesFromDBRespose);});}); ' 関数は決して呼び出されません。 – stevehin