【发布时间】:2021-05-18 09:17:11
【问题描述】:
我正在使用 Angular 9+。
虽然 unit testing 服务实现了 httpClient 并发出 http 请求,但我将这个 documentation 由 Angular Team 引用。我遵循了这个过程,并且在单元测试中也取得了成功。
以下是代码(取自文档):
it('can test HttpClient.get', () => {
const testData: Data = {name: 'Test Data'};
// Make an HTTP GET request
httpClient.get<Data>(testUrl)
.subscribe(data =>
// When observable resolves, result should match test data
expect(data).toEqual(testData)
);
// The following `expectOne()` will match the request's URL.
// If no requests or multiple requests matched that URL
// `expectOne()` would throw.
const req = httpTestingController.expectOne('/data');
// Assert that the request is a GET.
expect(req.request.method).toEqual('GET');
// Respond with mock data, causing Observable to resolve.
// Subscribe callback asserts that correct data was returned.
req.flush(testData);
// Finally, assert that there are no outstanding requests.
httpTestingController.verify();
});
我的问题是:
-
既然
http calls是asynchronous,为什么文档中提供的任何测试中都没有编写fakeAsync()?就像通常在单元测试asynchronous methods(setTimeout() , setInterval()) 时一样,角度提供的文档表明我们需要一个假的 zone.js,它将所有异步请求附加到一个数组,然后我们使用 flushMicrotasks( ) 或 tick() 以进一步方便调用。 -
当
req.flush()被调用时,控制流是如何发生的?我们调用了函数httpClient.get<Data>(testUrl),它订阅了 observable,并且 flush 用于解决它。所以测试规范中的整个流程都是异步/同步发生的?
【问题讨论】:
标签: angular unit-testing jasmine httprequest