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

问题描述 投票:5回答:1

[在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()应该存在,它将使用适当的异步帮助器包装我的回调。
  4. [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);
        } ));
    })
angular unit-testing karma-jasmine angular7 angular-test
1个回答
0
投票

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

  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。希望能有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.