AngularJS模拟承诺TypeError:'undefined'不是对象(评估'queryDeferred.resolve')

时间:2015-03-19 14:28:54

标签: angularjs unit-testing mocking angular-promise

我正在尝试使用ressources / promises在控制器上进行一些测试。我跟着文章Mocking $resource and promises in AngularJS unit tests

但由于queryDeferred对象未定义,我无法使用简单的案例。

错误

PhantomJS 1.9.8 (Linux) OrdersModule API.Orders.query should query the API.Orders FAILED
        TypeError: 'undefined' is not an object (evaluating 'queryDeferred.resolve')
            at /mnt/data/projects/tcs_economat/frontend/static_src/test/unit/orderSpec.js:52
PhantomJS 1.9.8 (Linux): Executed 25 of 25 (1 FAILED) (0.235 secs / 0.223 secs)

控制器

"use strict";
angular.module('OrdersModule', ['services'])
.controller('OrdersControllers', ['$scope', 'API', function ($scope, API) {
        $scope.orders = [];
        API.Order.query().$promise.then(function (data) {
            console.log(data);
        });
    }]
);

测试

"use strict";

describe('OrdersModule', function () {
    var $q,
        $rootScope,
        $scope,
        mockOrdersApiService,
        queryDeferred,
        mockOrdersResponse = [
            {status: 'DRAFT'},
            {status: 'DRAFT'}
        ];

    beforeEach(module('tcsStoreApp'));

    beforeEach(inject(function (_$q_, _$rootScope_) {
        $q = _$q_;
        $rootScope = _$rootScope_;
    }));

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

        mockOrdersApiService = {
            query: function () {
                queryDeferred = $q.defer();
                return {$promise: queryDeferred.promise};
            }
        };

        spyOn(mockOrdersApiService, 'query').andCallThrough();

        $controller('OrdersControllers', {
            '$scope': $scope,
            'API.Orders': mockOrdersApiService
        });
    }));

    describe('API.Orders.query', function () {
        beforeEach(inject(function (_$httpBackend_, $rootScope, $controller) {
            var $httpBackend = _$httpBackend_;
            queryDeferred.resolve(mockOrdersResponse);
            $rootScope.$apply();
            $httpBackend.expectGET('/static/js/tcs.fr.json').respond({});
        }));

        it('should query the API.Orders', function () {
            expect(mockOrdersApiService.query).toHaveBeenCalled();
        });
    });
});

问题

  • mockOrdersApiService是否正确声明?
  • 为什么queryDeferred.resolve未定义?

0 个答案:

没有答案