Javascript AngularJS单元测试:与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

我试图在下面相应的(Jasmine)单元测试中使用
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);
    });
  });
}