AngularJS1.5项目中Karma+Jasmine测试含await异步函数异常问题
解决AngularJS 1.5中Karma+Jasmine测试async/await异步函数的问题
问题根源
AngularJS 1.x的$q Promise依赖**脏检查循环(Digest Cycle)**才能完成状态转换,而原生async/await的await关键字虽然兼容Promise/A+规范,但$q Promise的resolve/reject必须手动触发脏检查,才能被await感知到。同时你的测试仅执行了一次flush且未触发脏检查,导致第一个await后的代码无法推进。
解决方案
修改测试代码,结合$httpBackend.flush()、$rootScope.$digest()和await,确保异步流程完全执行:
it('testA', inject(async function($httpBackend, $rootScope) { // 配置请求响应 $httpBackend.when('GET', 'url1').respond(200, [myresult]); $httpBackend.when('GET', 'url2').respond(200, [myresult]); const controller = MyController(); // 启动异步函数并获取其返回的Promise const asyncTask = controller.a(); // 处理第一个HTTP请求,触发b()的响应 $httpBackend.flush(); // 触发脏检查,让$q Promise完成resolve,推进第一个await $rootScope.$digest(); // 此时第一个await已完成,代码执行到console.log(var1)并发起了c()的请求 $httpBackend.flush(); // 再次触发脏检查,推进第二个await $rootScope.$digest(); // 等待整个异步函数执行完成 await asyncTask; // 此处可添加断言逻辑,比如验证请求调用次数、返回值状态等 }));
关键说明
- 多次调用
$httpBackend.flush():两个请求是串行发起的(第二个请求在第一个await完成后才会触发),因此需要分两次flush处理。 - 触发脏检查:每次flush后必须调用
$rootScope.$digest()(或$rootScope.$apply()),让$qPromise完成状态转换,确保await能感知到Promise已resolve,继续执行后续代码。 - await异步函数返回的Promise:async函数本身会返回原生Promise,通过
await它可以保证测试等待整个异步流程结束后再终止。
内容的提问来源于stack exchange,提问作者viicen
相关产品推荐
相关产品推荐

