嘲笑茉莉花的承诺

时间:2014-11-03 11:42:58

标签: javascript angularjs unit-testing jasmine promise

我正在尝试编写茉莉花单元测试以测试角度控制器,并且遇到注入服务并返回承诺的问题。

我有一个从服务器检索数据的服务:

app.factory('LookupService', ['$resource', '$http', '$cookies',
function ($resource, userId) {
    return $resource('./Controller/GetFunction', {}, {
        query: { method: 'GET', params: { userId: userId }, isArray: true }
    });
}]);

在控制器中调用:

$scope.returnedDataStore = lookupService.get({ userId: $scope.userId });
$scope.returnedDataStore.$promise.then(function (result) {
    $scope.processData(result.data);
});

在我的单元测试中,我正在注入此服务,如下所示:

beforeEach(function () {
    module('app');

    lookupService = jasmine.createSpyObj('LookupService', ['get']);

    inject(function ($rootScope, $controller, $q) {
        $scope = $rootScope.$new();

        var deferred = $q.defer();
        lookupService.get.and.returnValue(deferred.promise);

        ctrl = $controller('myController', {
            $scope: $scope,
            LookUpService: lookupService
        });
    });
});

但是,在控制器中调用服务时,我收到一条错误,指出$scope.returnedDataStore.$promise未定义:

  

无法读取属性'然后'未定义的

我经常搜索以试图解决这个问题,但我没有太多运气。

如果有人能指出我正确的方向,我会非常感激!

1 个答案:

答案 0 :(得分:0)

我通常做的是 -

处理服务承诺并将promise对象返回给控制器,看看它对你有用:

describe('Controller: mainCtrl', function() {
    beforeEach(module('myApp'));

    var mainCtrl,
        scope,
        someService,
        spyGetSomething;


    beforeEach(inject(function($controller, $rootScope) {
        someService = {
            getSomething: function() {}
        };

        spyGetSomething = spyOn(someService, 'getSomething').andReturn({
            then: function() {}
        });

        mainCtrl = $controller('mainCtrl', {
            $scope: scope,
            SomeService: someService
        });
    });
    ... 

    it('Should call SomeService.getSomething() ', function() {
        expect(spyGetSomething).toHaveBeenCalled();
    });


});

(注意:没有测试)