使用 Jasmine 2.4.* 测试返回承诺的服务



我在测试函数在 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() 解决了这个问题。

相关内容

  • 没有找到相关文章

最新更新