在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);
} ));
})
中。我是否缺少现有的概念或语法?有更好的选择吗?
cin >> PlayerUsername;
答案 0 :(得分:1)
有两种不同的方式来处理异步测试:
(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。希望有帮助!