1

我有一个最终触发对 Angular HttpClient 的调用的 observable。我需要模拟来自 HttpClient 的响应,但是我不知道如何在 TestScheduler 运行方法的上下文中执行它。假设我有以下测试:

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为所需的响应?

编辑精简beforeEach设置,显示以下配置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 实例的屏幕截图。

在此处输入图像描述

编辑 3: Stackblitz 在这里发布。失败的测试contract$ should return contract是令人感兴趣的。

4

0 回答 0