提问人:Gellért Kovács 提问时间:11/29/2019 最后编辑:georgeawgGellért Kovács 更新时间:11/29/2019 访问量:365
在 AngularJS 中使用 jasmine 测试包含嵌套异步方法调用的异步服务方法
Testing async service method containing nested async method call with jasmine in AngularJS
问:
我正在尝试测试以下方法在其 promise 中返回的内容(并且都是在 angularJS 服务中定义的两种方法):functionToTest
asyncGet
var functionToTest = function (param) {
var deferred = $q.defer();
asyncGet(param).then(function (result) {
//business login involving result
if (something)
return deferred.resolve(true);
else
return deferred.resolve(false);
});
return deferred.promise;
}
单元测试如下所示:
it ('should return true', function (done) {
var asyncGetResult = {};
spyOn(asyncGet).and.returnValue($q.resolve(asyncGetResult));
var param = {};
functionToTest(param).then(function (result) {
expect(result).toBe(true);
done();
});
$scope.$apply();
});
运行测试时,我收到超时错误:
在指定的超时时间内未调用异步回调 茉莉花。DEFAULT_TIMEOUT_INTERVAL。
我尝试在 之后放置一个右键,但它没有打印任何内容,所以似乎从未执行过 的回调。console.log()
expect()
functionToTest(param).then()
任何帮助将不胜感激。
答:
0赞
georgeawg
11/29/2019
#1
删除 $q.deferred 反模式:
var functionToTest = function (param) {
̶v̶a̶r̶ ̶d̶e̶f̶e̶r̶r̶e̶d̶ ̶=̶ ̶$̶q̶.̶d̶e̶f̶e̶r̶(̶)̶;̶
return asyncGet(param).then(function (result) {
//business login involving result
if (something)
return true;
else
return false;
});
̶r̶e̶t̶u̶r̶n̶ ̶d̶e̶f̶e̶r̶r̶e̶d̶.̶p̶r̶o̶m̶i̶s̶e̶;̶
}
此外,请提供错误处理程序:
functionToTest(param).then(function (result) {
expect(result).toBe(true);
done();
}).catch(function(err) {
console.log(err);
done();
});
如果代码编写错误,延迟反模式可能会挂起。避免使用反模式以防止此问题。
包括一个处理程序以查看任何错误。.catch
评论
0赞
Gellért Kovács
11/29/2019
谢谢你的建议!我从代码中删除了反模式,但不幸的是,测试仍然给出了超时。catch() 错误处理程序也不会被触发。
评论