1

最終的に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は興味深いものです。

4

0 に答える 0