Angular 7测试-异步函数调用+ async..await

时间:2019-03-02 22:25:39

标签: angular unit-testing karma-jasmine angular7 angular-test

在Angular 7单元测试中,当结合使用异步支持和async( async(){} )关键字时,是否有避免双重async..await语法的方法?

我对angular并不陌生,但是是一位经验丰富的程序员,并且在使用我喜欢的测试样式时遇到了麻烦。

我想在测试中安全地使用async..await,并且了解以下语法。但是,在指示现代javascript和/或async..await概念的开发者时,双重async(async())语法是多余的,而且会使他们感到困惑。他们忽略了外部异步。服务中抛出的异常导致在实际测试之外报告失败,这很难跟踪。

以下其中一项似乎更好:

  1. it()应该神奇地支持async..await并将回调保存在async()中,这样我就不必考虑了。
  2. it()应该带有一个可选的函数参数(即asyncfakeAsync),该参数将包装我的回调函数。
  3. it()ita()的变体itfa()it()会用适当的异步帮助程序包装我的回调。
  4. asyncitf()包装我的回调,另外的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;

1 个答案:

答案 0 :(得分:1)

有两种不同的方式来处理异步测试:

  1. 使用内置的因果完成函数:(doneFunction) => {async test here... then eventually call done();}。它可以让您对测试的结束位置进行细粒度的控制,但可以让您自己done.fail(error)来自行处理错误。
  2. 包装角度async()函数。这是上面示例的一部分,但是正如您指出的那样,Angular异步函数似乎并不自动在内部支持await语法,因此必须使用内部异步来获得对await的支持。
  3. 使用Angular fakeAsync()包装器函数,该函数可让您在代码中的任何地方调用tick(),以模拟时间的流逝以及可观察,承诺和其他异步函数的解析。缺点:您无法在其中进行HTTP调用,因为它们会实时发生。

尽管我发现这3种方法各有利弊,但我发现#2对于创建易于阅读的平滑流动测试最有用。因此,尽管您可以使用#1或#3避免嵌套的异步代码,但我不确定这样做的好处是否会超过成本。根据您的建议,您可能需要考虑向angular repo提交功能请求,如果它对您很重要。

有关更多信息,我发现此源非常有用:https://medium.com/@michaelericksen_12434/angular-asynchronous-test-patterns-and-recipes-202cf7d47ec7。希望有帮助!

相关问题