在 Angular 7 单元测试中,有没有办法避免双重 async( async(){} )
将异步支持与 async..await
结合使用时的语法关键词?
我是 angular 的新手,但我是一位经验丰富的程序员,而且我无法使用我喜欢的测试风格。
我想安全使用 async..await
在测试中,我理解以下语法。但是,当指导开发人员不熟悉现代 javascript 和/或 async..await
的概念时双async(async())
语法对他们来说是多余的和困惑的。他们忽略了外部异步。服务中抛出的异常会导致在实际测试之外报告失败,这很难追踪。
似乎以下之一会更好:
it()
应该神奇地支持async..await
并将我的回调包裹在 async()
中这样我就不用考虑了。 it()
应该采用一个可选的函数参数(即 async
或 fakeAsync
)来包装我的回调。 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);
} ));
})
最佳答案
有几种不同的方法来处理异步测试:
(doneFunction) => {async test here... then eventually call done();}
.它使您可以对测试结束的位置进行细粒度控制,但让您可以使用 done.fail(error)
自行处理错误。 . 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/