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

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())语法的概念时,对他们来说是多余的和令人困惑的。他们忽略了外部异步。服务中抛出的异常会导致在实际测试之外报告失败,这很难追踪。

似乎以下之一会更好:

  1. it()应该神奇地支持async..await和包装我的回调,async()这样我就不必考虑它了。
  2. it()应该采用一个可选的函数参数(即,asyncor fakeAsync)来包装我的回调。
  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);
        } ));
    })
Run Code Online (Sandbox Code Playgroud)

Roc*_*Man 1

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

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

虽然我发现这 3 种方法各有利弊,但我发现#2 对于创建易于阅读的流畅测试最有用。因此,尽管您可以使用 #1 或 #3 来避免嵌套异步代码,但我不确定其好处是否会超过成本。就您的建议而言,如果功能请求对您很重要,您可能需要考虑向Angular 存储库提交功能请求。

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