我有一个最终触发对 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
是令人感兴趣的。