Angular 7测试 - 异步函数调用+异步..等待

6
在 Angular 7 单元测试中,是否有一种方法可以避免在同时使用 async 支持和 async..await 关键字时使用双重 async(async()) 语法?
我是 Angular 的新手,但是是经验丰富的程序员,我很难确定我的首选测试风格。我希望在测试中安全地使用 async..await,并且我理解下面的语法。然而,当指导对现代 JavaScript 和/或 async..await 概念不熟悉的开发人员时,双重 async(async()) 语法会使他们感到冗余和困惑。服务中抛出的异常会导致在实际测试之外报告失败,这很难跟踪。
以下其中一个似乎更好:
1. it() 应该自动支持 async..await 并包装我的回调函数,以便我不必考虑它。 2. it() 应该采用可选的函数参数 (i.e., async 或 fakeAsync),将包装我的回调函数。 3. 应该存在 it() 变体 ita() 和 itfa(),它们将使用适当的 async 辅助程序包装我的回调。 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);
        } ));
    })

关于“令人困惑”的问题,现在他们将async()重命名为waitForAsync(),或许更容易理解一些了? - Coderer
1个回答

1

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

  1. 使用内置的 karma doneFunction:(doneFunction) => {async test here... then eventually call done();}。它可以让你精细控制测试结束的位置,但是你需要自己处理错误,使用 done.fail(error)
  2. 使用 Angular 的 async() 函数包装。这是你上面示例中的一部分,但是如你所指出的,似乎 Angular 的 async 函数不会自动支持其中的 await 语法,因此需要使用内部的 async 来获取 await 的支持。
  3. 使用 Angular 的 fakeAsync() 包装函数,允许你在代码的任何地方调用 tick() 来模拟时间的流逝以及可观察对象、承诺和其他异步函数的解析。一个缺点:你不能在其中进行 HTTP 调用,因为它们会实时发生。
虽然我发现这3种方法都有优缺点,但我发现第二种对于创建流畅易读的测试最为有用。因此,尽管您可以使用第一种或第三种方法避免嵌套的异步代码,但我不确定好处是否超过成本。至于您的建议,如果对您很重要,您可能需要考虑向angular repo提交功能请求。
更多信息,请参阅此来源:https://medium.com/@michaelericksen_12434/angular-asynchronous-test-patterns-and-recipes-202cf7d47ec7。希望这有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接