正确嘲弄$resource/ promise服务与茉莉花间谍



我在模拟和测试我的angular应用程序时遇到了麻烦。给定下面的文件,我总是得到错误延迟未定义。

如何用Promise正确地模拟API ?我如何测试API确实在运行,并将响应附加到$作用域。数据变量?

控制器

angular.module('app').controller('controllerOne', [
    '$scope',
    'API',
    function($scope, API) {
        $scope.init = function() {
            $scope.data = API.query(function(response) {
                return response;
            });
        };
    }
]);
<<p> API服务/strong>
angular.module('app').factory('API', ['$resource',
    function($resource) {
        return $resource('api/url/:Id', {
            Id: '@_id'
        }, {
            update: {
                method: 'PUT'
            }
        });
    }
]);

控制器规范

describe('app Module', function() {
    beforeEach(function() {
        module('app');
    });
    var mockAPI, q, $scope, ctrl;
    beforeEach(function() {
        mockAPI = {
            query: function() {
                var deferred = q.defer();
                return deferred.promise;
            }
        };
    });
    beforeEach(inject(function($controller, $rootScope, $q) {
        $scope = $rootScope.$new();
        q = $q;
        ctrl = $controller('controllerOne', {
            $scope: $scope,
            API: mockAPI
        });
    }));
    it('should query API', function() {
        spyOn(mockAPI, 'query').and.callThrough();
        $scope.init();
        deferred.resolve();
        $scope.$root.$digest();
        expect(mockAPI.query).toHaveBeenCalled();
    });
});

如果我运行以下代码,一切正常,但我认为这是不对的,因为我正在初始化API。

it('should query API', function() {
    mockAPI.query();
    expect(mockAPI.query).toHaveBeenCalled();
});

正确的方法是什么?怎么做?

您遇到的问题是由于mockAPI查询中定义的延迟变量的作用域。它应该在套件级别确定范围,以便在您的测试中可以访问它以进行解析。

假设剩下的代码没问题,下面的代码将解决deferred is not defined的问题。

describe('app Module', function() {
    beforeEach(function() {
        module('app');
    });
    var mockAPI, deferred, q, $scope, ctrl;
    beforeEach(function() {
        mockAPI = {
            query: function() {
                deferred = q.defer();
                return deferred.promise;
            }
        };
    });
    beforeEach(inject(function($controller, $rootScope, $q) {
        $scope = $rootScope.$new();
        q = $q;
        ctrl = $controller('controllerOne', {
            $scope: $scope,
            API: mockAPI
        });
    }));
    it('should query API', function() {
        spyOn(mockAPI, 'query').and.callThrough();
        $scope.init();
        deferred.resolve();
        $scope.$root.$digest();
        expect(mockAPI.query).toHaveBeenCalled();
    });
});

最新更新