Jas*_*son 6 unit-testing karma-jasmine angular angular-test angular7
在 Angular 7 单元测试中,有没有办法async( async(){} )在将异步支持与async..await关键字结合使用时避免双重语法?
我是 angular 的新手,但我是一位经验丰富的程序员,而且我无法选择我喜欢的测试风格。
我想async..await在测试中安全使用,并且我理解以下语法。然而,当指导开发人员接触现代 javascript 和/或async..await双重async(async())语法的概念时,对他们来说是多余的和令人困惑的。他们忽略了外部异步。服务中抛出的异常会导致在实际测试之外报告失败,这很难追踪。
似乎以下之一会更好:
it()应该神奇地支持async..await和包装我的回调,async()这样我就不必考虑它了。it()应该采用一个可选的函数参数(即,asyncor fakeAsync)来包装我的回调。it()变化ita()并且itfa()应该存在,它将用适当的异步助手包装我的回调。it()用 包装我的回调async,另外一个itf()将我的回调包装在fakeAsync.我是否缺少现有的概念或语法?有更好的选择吗?
import { async } from '@angular/core/testing';
describe('MyService', () => {
let service: MyService;
...
it('should get data', async( async() => {
// arrange
let expectedData = { answer: 42 };
// act
let data = await service.getDataAsync();
// assert
expect(data).toEqual(expectedData);
} ));
})
Run Code Online (Sandbox Code Playgroud)
有几种不同的方法来处理异步测试:
(doneFunction) => {async test here... then eventually call done();}。它使您可以对测试结束的位置进行细粒度控制,但使您可以自行处理错误done.fail(error)。tick()来模拟时间的流逝以及可观察量、承诺和其他异步函数的解析。一个缺点是:您无法在此进行 HTTP 调用,因为它们是实时发生的。虽然我发现这 3 种方法各有利弊,但我发现#2 对于创建易于阅读的流畅测试最有用。因此,尽管您可以使用 #1 或 #3 来避免嵌套异步代码,但我不确定其好处是否会超过成本。就您的建议而言,如果功能请求对您很重要,您可能需要考虑向Angular 存储库提交功能请求。
有关更多信息,我发现此来源非常有用:https://medium.com/@michaelericksen_12434/angular-asynchronous-test-patterns-and-recipes-202cf7d47ec7。希望有帮助!