[在Angular 7单元测试中,将异步支持与async( async(){} )
关键字结合使用时,有没有一种方法可以避免双重async..await
语法?
我对angular并不陌生,但是是一位经验丰富的程序员,在我偏爱的测试风格上遇到了麻烦。
我想在测试中安全地使用async..await
,并且我理解以下语法。但是,当指示现代javascript的新开发人员和/或async..await
概念时,双重async(async())
语法是多余的并使他们感到困惑。他们忽略了外部异步。服务中引发的异常导致在实际测试之外报告失败,这很难跟踪。
似乎下列其中一项会更好:
it()
应该神奇地支持async..await
并将我的回调包装在async()
中,这样我就不必考虑它了。it()
应采用可选的函数参数(即async
或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);
} ));
})
有几种不同的方式来处理异步测试:
(doneFunction) => {async test here... then eventually call done();}
。它使您可以对测试的结束位置进行细粒度的控制,但可以使用done.fail(error)
自行处理错误。tick()
,以模拟时间的流逝以及可观察变量,承诺和其他异步函数的解析。缺点:您无法在其中进行HTTP调用,因为它们会实时发生。尽管我发现这3种方法各有利弊,但我发现#2对于创建易于阅读的平滑流动测试最有用。因此,尽管您可以使用#1或#3避免嵌套的异步代码,但我不确定这样做的好处是否会超过成本。根据您的建议,您可能需要考虑向angular repo提交功能请求,如果它对您很重要。
有关详细信息,我发现此源非常有用:https://medium.com/@michaelericksen_12434/angular-asynchronous-test-patterns-and-recipes-202cf7d47ec7。希望能有所帮助!