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

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

在 Angular 7 单元测试中,有没有办法避免双重 async( async(){} )将异步支持与 async..await 结合使用时的语法关键词?

我是 angular 的新手,但我是一位经验丰富的程序员,而且我无法使用我喜欢的测试风格。

我想安全使用 async..await在测试中,我理解以下语法。但是,当指导开发人员不熟悉现代 javascript 和/或 async..await 的概念时双async(async())语法对他们来说是多余的和困惑的。他们忽略了外部异步。服务中抛出的异常会导致在实际测试之外报告失败,这很难追踪。

似乎以下之一会更好:

  • it()应该神奇地支持async..await并将我的回调包裹在 async() 中这样我就不用考虑了。
  • it()应该采用一个可选的函数参数(即 asyncfakeAsync )来包装我的回调。
  • 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);
            } ));
        })
    

    最佳答案

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

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

  • 尽管我发现这 3 种方法中的每一种都有优点和缺点,但我发现 #2 对于创建易于阅读的流畅测试最有用。因此,尽管您可以通过使用 #1 或 #3 来避免嵌套异步代码,但我不确定 yield 是否会超过成本。至于您的建议,您可能需要考虑向 angular repo 提交功能请求。如果它对你很重要。

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

    关于Angular 7 测试 - 异步函数调用 + async..await,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54963635/

    相关文章:

    javascript - Ionic 2 无法解析 InAppBrowser 的所有参数

    javascript - Http Get- 从 Web api 获取对象

    c# - 在 Visual Studio 2017 + NUnit + Resharper 中配置单元测试

    php - 如何在 Laravel 单元测试中避免 ThrottleRequestsException?

    Angularjs 单元测试依赖于路由解析的 Controller

    html - Angular Testing : Failed to load html component

    angular - firebase_app__WEBPACK_IMPORTED_MODULE_5__.app(...).functions 不是函数

    javascript - 如何重置数组中的值,OnClick 到按钮?

    angularjs - 如何使用 Jasmine 的 debounce 功能测试 AngularJS watch

    Angular 4单元测试错误 "TypeError: Cannot read property '订阅'未定义”