我在测试函数在 Jasmine 中返回承诺时遇到了一些问题。 这个解决方案非常接近我遇到的问题:当没有强制摘要$scope时,如何解决 AngularJS、Jasmine 2.0 中的承诺?
这篇文章来自2014年,目前尚不清楚他们使用的是哪个版本的茉莉花。 这仍然是测试当前 (2.4.0^) 版本中解析承诺的函数的正确原因吗?
编辑:
我有一个服务,其模式如下所示:
angular.module('somemodule').factory('listOfDependencies','NewService');
function NewService(listOfDependencies){
var getObject = function(para1, para2,...,paraN){
var deferred = $q.defer();
if(someDependency.method())
deferred.resolve(someDependency.get(key));
else
deferred.resolve(returnsNewObject);
// there's also a case that returns deferred.reject(reason);
return deferred.promise;
};
return getObject:getObject;
};
在我的规格中,测试目前看起来像这样
it('should return the object', inject(function() {
var obj = { some: Object };
NewService.getObject('param1'...'paramN').then(
function(data){
expect(data.obj).toEqual(obj);
},
function(response){
//promise failed
});
现在,我希望基于对象"obj"返回的内容应该通过。在我的服务中,在这种情况下,它应该在逻辑上返回"
if(someDependency.method())
deferred.resolve(someDependency.get(key));
问题是它返回的对象是:
else
deferred.resolve(returnsNewObject);
代码中的逻辑或其任何依赖项都没有错(我将所有这些拆开并多次测试),所以我觉得 jasmine 规范中的语法(?)有问题,或者我只是没有正确测试承诺。 感谢您查看此内容!
解析承诺,然后检查它解析的值是否有效且预期,这绝对是一种方法。
如果您同意使用 Chai 库,它会更简洁:http://chaijs.com/plugins/chai-as-promised/
为了使您的代码更容易进行单元测试,请尝试在 Angular 服务(而不是在控制器中)中尽可能多地完成繁重的工作,并让服务返回承诺。这样,单元测试就可以使用各种输入调用服务方法,并确保按预期拒绝/解析承诺。
我在测试结束时通过调用 $rootScope.$apply() 解决了这个问题。