最終的にAngular HttpClientへの呼び出しをトリガーするオブザーバブルがあります。HttpClient からの応答をモックする必要がありますが、TestScheduler の run メソッドのコンテキスト内でそれを行う方法がわかりません。次のテストがあるとします。
it('observable should trigger call to HttpClient', () => {
scheduler.run(helpers => {
const { expectObservable, cold } = helpers;
const transferObservable = cold('-a-', { a: someInput });
transferService.value$ = transferObservable;
sut = new MyService(transferService, apiService);
const expectedMarble = '-a-';
const expectedValues = { a: expectedData };
expectObservable(sut.data$).toBe(expectedMarble, expectedValues);
});
});
transferObservable
カスケードで発行された値switchMap
は、Angular HttpClient を介して GET リクエストを送信するサービスへの呼び出しに送信されます。結果の値は から出力されsut.data$
ます。
scheduler.run メソッド内外のさまざまな場所に次の行を配置しようとしましたが、常に同じエラーが発生します。Expected one matching request for criteria "Match URL: http://foo", found none.
const request = httpMock.expectOne(`http://foo`);
request.flush(expectedContract);
大まかにどこでどのように単一の呼び出しをモックし、目的の応答としてhttp://foo
フラッシュしますか?expectedData
EDITbeforeEach
の構成を示す簡素化されたセットアップHttpTestingController
:
beforeEach(() => {
scheduler = new TestScheduler((actual, expected) => {
expect(actual).toEqual(expected);
});
transferService = jasmine.createSpyObj<TransferService>(['value$']);
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
declarations: [],
providers: [],
schemas: [NO_ERRORS_SCHEMA]
});
httpMock = TestBed.inject(HttpTestingController);
});
編集 2 : デバッグ時のサービス内からの HttpClient インスタンスのスクリーンショット。
EDIT 3 :ここで発行する Stackblitz 。失敗したテストcontract$ should return contract
は興味深いものです。