控制器中的离子单元测试,spyOn未通过

Ionic unit test in controller, spyOn not passing

本文关键字:spyOn 单元测试 控制器      更新时间:2024-03-01

这是一个非常简单的测试。。它不会过去的。。如果有人能对此有所了解:)

这是需要测试的控制器代码(部分)

AppCtrl

    $scope.requestAuthorization = function() { requestAuthorization(); };
    if ($stateParams.requestAuthorization === true) {
        console.log('$stateParams.requestAuthorization');
        $scope.requestAuthorization();
    }
    function requestAuthorization() {
        console.log('requestAuthorization()');
        // more code here..
    }

测试

describe('AppCtrl', function() {
    var AppCtrl, $rootScope, $scope, $stateParams;
    beforeEach(module('myapp'));
    // disable ionic cache to avoid GET errors
    beforeEach(module(function($provide, $urlRouterProvider) {
        $provide.value('$ionicTemplateCache', function() {});
        $urlRouterProvider.deferIntercept();
     }));
    beforeEach(inject(function($controller, _$rootScope_, _$injector_, _$stateParams_) {
        $rootScope = _$rootScope_;
        $scope = $rootScope.$new();
        $stateParams = _$stateParams_;
        AppCtrl = $controller('AppCtrl',{
            $scope: $scope
        });
        spyOn($scope, 'requestAuthorization');  
        $stateParams.requestAuthorization = true;
    }));
     it('$stateParams.requestAuthorization should be defined', function() {
        expect($stateParams.requestAuthorization).toBeDefined();
    });
    it('$scope.requestAuthorization should be defined', function() {
        expect($scope.requestAuthorization).toBeDefined();
    });
    // this test is not passing.. 
    it('should call requestAuthorization', function() {
        expect($scope.requestAuthorization).toHaveBeenCalled();
    });
});

函数实际上正在被调用,我可以在控制台中看到console.log,但它没有通过。

简单的测试,全部通过。。除了最后一个。。

感谢您抽出时间:)

注意:有一个$stateParams.requestAuthorization和一个$scope.requestAuthorization。第一个是布尔值,另一个是函数,函数不传递。

在beforeEach块中,在安装控制器之前定义$stateParams。

beforeEach(inject(function($controller, _$rootScope_, _$injector_, _$stateParams_) {
            $rootScope = _$rootScope_;
            $scope = $rootScope.$new();
            $stateParams = _$stateParams_;
            $stateParams.requestAuthorization = true;
            AppCtrl = $controller('AppCtrl',{
                $scope: $scope,
                $stateParams: $stateParams
            });
            spyOn($scope, 'requestAuthorization');  
        }));