return 承诺使用 Jasmine 2.4 测试服务。*

Testing services that return promises using Jasmine 2.4.*

我在测试 Jasmine 中的 return promises 函数时遇到了一些问题。此解决方案非常接近我遇到的问题:How to resolve promises in AngularJS, Jasmine 2.0 when there is no $scope to force a digest?

post 是 2014 年的,不清楚他们使用的是哪个版本的 jasmine。这仍然是测试解决当前 (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' return 编辑的内容应该通过了。在我的服务中,这种情况在逻辑上应该 return"

if(someDependency.method())
        deferred.resolve(someDependency.get(key));

问题是它 return 的对象是:

        else
        deferred.resolve(returnsNewObject);

代码中的逻辑或其任何依赖项都没有错(我把所有这些都拆开并测试了很多次)所以我觉得 jasmine 规范中的语法(?)有问题或者我'只是没有正确测试承诺。感谢您看一看!

解析 promise,然后检查它解析的值是否有效和预期,这绝对是一种方法。

如果您可以使用 Chai 库,它会更简洁: http://chaijs.com/plugins/chai-as-promised/

为了使您的代码更容易进行单元测试,请尝试在 Angular 服务中(而不是在控制器中)完成尽可能多的繁重工作,并让服务 return 承诺.这样,您的单元测试就可以调用具有各种输入的服务方法,并确保承诺 rejected/resolved 符合预期。

我通过调用 $rootScope.$apply(); 解决了这个问题;在我的测试结束时。