Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 角度单元测试Jasmine间谍错误_Angularjs_Unit Testing_Jasmine - Fatal编程技术网

Angularjs 角度单元测试Jasmine间谍错误

Angularjs 角度单元测试Jasmine间谍错误,angularjs,unit-testing,jasmine,Angularjs,Unit Testing,Jasmine,以下控制器收到一个TypeError:“undefined”不是函数(正在评估sessionService.getCurrentPlace())。我有一个模拟服务,这个方法被监视。模拟服务上的另一个方法工作良好。我尝试了.AndReturns({..})和以及和callthrough()但没有成功。你知道我错过了什么,还是我做错了?非常感谢 控制器: 'use strict'; angular.module('wallyApp') .controller('addGateway

以下控制器收到一个TypeError:“undefined”不是函数(正在评估
sessionService.getCurrentPlace()
)。我有一个模拟服务,这个方法被监视。模拟服务上的另一个方法工作良好。我尝试了
.AndReturns({..})
以及
和callthrough()
但没有成功。你知道我错过了什么,还是我做错了?非常感谢

控制器:

    'use strict';

angular.module('wallyApp')
    .controller('addGatewayCtrl', function ($scope, $location, $filter, sessionService) {
        /*
            private members
        */
        //set scope from session data
        $scope.processSession = function (places) {
            $scope.currentPlaceId = sessionService.getCurrentPlace();
            if (!$scope.currentPlaceId) {
                $scope.currentPlaceId = places[0].id;
            }
            $scope.place = $filter("getById")(places, $scope.currentPlaceId);
            $scope.ready = true;
        };

        /* 
            setup our scope
        */
        $scope.currentPlaceId = null;
        $scope.place = {};
        $scope.videoSrc = "/videos/gateway-poster.gif";
        $scope.loaded = true;

        /*
            setup controller behaivors
        */

        //set video or gif to show or hide video
        $scope.setVideo = function () {
            $scope.videoSrc = "/videos/gateway.gif";
        };
        $scope.setPoster = function () {
            $scope.videoSrc = "/videos/gateway-poster.gif";
        };
        //initialize scope
        $scope.setVideo();

        //submit form
        $scope.continue = function () {
            $location.path("/setup/pair-gateway");
            return false;
        };
        //cancel
        $scope.back = function () {
            $location.path("/setup/plan-locations");
            return false;
        };
        //wifi
        $scope.gotoWifi = function () {
            $location.path("/setup/wifi");
            return false;
        };


        /*
            setup our services, etc
        */
        //get our places from the cache
        sessionService.get("places").then(function (places) {
            if (!places || places.length < 1) {
                sessionService.refreshPlaces(); //Note we don't care about the promise as our broadcast watch will pick up when ready
            } else {
                $scope.processSession(places);
            }
        }).catch(function (error) {
            //TODO:SSW Call Alert Service??
        });

        //Watch broadcast for changes
        $scope.$on("draco.placesRefreshed", function (event, data) {
            sessionService.get("places").then(function (places) {
                $scope.processSession(places);
            });
        });
    });

所以我想出来了。对于嵌套的延迟函数,必须在其间调用$scope.$apply()。下面修复了它(同时对模拟数据响应进行了一些小的更改,但这些都是微不足道的):


使用
$rootScope.$digest()是所需的全部内容,将导致更快的测试。
    'use strict';

describe('addGatewayCtrl', function () {
    var $q,
        $rootScope,
        $location,
        $scope,
        $filter,
        mockSessionService,

        completePath = "/setup/pair-gateway",
        backPath = "/setup/plan-locations",
        wifiPath = "/setup/wifi",
        sessionDeferred,
        sessionInitDeferred,

        mockPlaces = [{ id: "0001" }];

    beforeEach(module('wallyApp'));

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

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

        mockSessionService = {
            get: function (contact) {
                sessionDeferred = $q.defer();
                return sessionDeferred.promise;
            },
            getCurrentPlace: function () {
                return mockPlaces[0].id;
            },
            refreshPlaces: function () {
                sessionInitDeferred = $q.defer();
                return sessionInitDeferred.promise;
            }
        };

        spyOn(mockSessionService, 'get').andCallThrough();
        spyOn(mockSessionService, 'getCurrentPlace').andReturn(mockPlaces[0].id);
        spyOn(mockSessionService, 'refreshPlaces').andCallThrough();

        $controller('addGatewayCtrl', {
            '$scope': $scope,
            '$location': $location,
            '$filter':$filter,
            'sessionService': mockSessionService
        });

    }));

    describe('call session service to get place data ', function () {

        //resolve our mock place and session services
        beforeEach(function () {
            //resolve mocks
            sessionDeferred.resolve(mockPlaces);

            $rootScope.$apply();
        });

        //run tests
        it('should have called sessionService get places', function () {
            expect(mockSessionService.get).toHaveBeenCalledWith("places");
        });
        it('should have called sessionService get currentPlaceId', function () {
            expect(mockSessionService.getCurrentPlace).toHaveBeenCalled();
        });
        it('should have set scope', function () {
            expect($scope.place).toEqual(mockPlaces[0]);
        });

    });

});
        //resolve promises
        activityMessagesDeferred.resolve(mockActivityMessages);
        $rootScope.$apply();
        $rootScope.$broadcast("draco.sessionRefreshed");
        activityCountDeferred.resolve(mockActivityCount);
        $rootScope.$apply();

        placesDeferred.resolve(mockPlaces);
        activityListDeferred.resolve(mockActivities);
        $rootScope.$apply();