Javascript AngularJS单元测试:与Jasmine一起使用异步/等待
我试图在下面相应的(Jasmine)单元测试中使用Javascript AngularJS单元测试:与Jasmine一起使用异步/等待,javascript,angularjs,unit-testing,jasmine,async-await,Javascript,Angularjs,Unit Testing,Jasmine,Async Await,我试图在下面相应的(Jasmine)单元测试中使用async/await关键字对Angular服务进行单元测试。对于原生的Promise的测试运行得很好,但我几乎被困在了使角度$q对应的工作中 角度:1.6.5 茉莉花:2.7.0 MacOS上的(无头)镀铬:60.x 这里提供的小提琴: 我尝试过谷歌,但它没有给我一个明显的好线索async函数基于本机承诺,而AngularJS使用$q承诺await是将承诺与then链接在一起的语法糖$q承诺链在测试摘要上执行 此不能用修复 await x
async/await
关键字对Angular服务进行单元测试。对于原生的Promise
的测试运行得很好,但我几乎被困在了使角度$q
对应的工作中
- 角度:1.6.5
- 茉莉花:2.7.0
- MacOS上的(无头)镀铬:60.x
这里提供的小提琴:
我尝试过谷歌,但它没有给我一个明显的好线索
async
函数基于本机承诺,而AngularJS使用$q承诺await
是将承诺与then
链接在一起的语法糖$q承诺链在测试摘要上执行
此不能用修复
await xPromise;
$rootScope.$digest();
因为在执行$rootScope.$digest()
之前不会计算$rootScope.$digest()
。这导致了悬而未决的承诺
AngularJS首先不应使用async..wait
进行测试。角度传感器设计为同步测试
是的
it('...', () => {
...
xPromise.then(x => {
expect(x).toEqual(43);
});
$rootScope.$digest();
});
或者承诺可以通过以下方式实现:
您可以为测试创建一个帮助器,将承诺从
$q
转换为本机承诺。看看吧
async/await
不知道$q
。他们与当地人合作。看看这个:我看到了。但是有什么解决办法吗?放置.run(函数runBlock($window,$q){$window.Promise=$q;})代码>只会让事情变得更糟-两个测试都失败:/I我认为这是目前可以接受的解决方法。谢谢!:)
it('...', () => {
...
xPromise.then(x => {
expect(x).toEqual(43);
});
$rootScope.$digest();
});
it('...', () => {
...
expect(xPromise).toBeResolvedWith(43);
$rootScope.$digest();
});
it('should work, too. but y not?!!', async (done) => {
const xPromise = toNativePromise(xService.getXAfter1SecWithAngular$Q());
$timeout.flush();
const x = await xPromise;
expect(x).toEqual(43);
done();
});
function toNativePromise(promise) {
return new Promise((resolve, reject) => {
promise.then(val => {
resolve(val);
}, err => {
reject(err);
});
});
}