AngularJS Jasmine 测试初始化​​函数

AngularJS Jasmine testing init functions

我正在尝试从我的控制器的初始化函数中测试函数调用。我根据 stateParams 路由各种逻辑,并想针对这种情况编写单元测试,但我无法使其正常工作。

我的初始化函数

    var _init = function () {
        // Get full companyList
        servicecall().then(function (response) {

            if ($stateParams.ID) {
                $scope.callOne();
            }
            else if ($stateParams.Index == -1) {
                $scope.callTwo();
            }
            else if ($stateParams.Index == '' || $stateParams.Index == null) {
                $scope.callThree();
            }
            else
                $scope.callFour();
        },
        function (err) {
            console.log(err);
        });
    };
    _init();

所以我只想设置 $stateParams.Index = -1,并确保 callTwo() 被调用。

我的beforeEach看起来像

    beforeEach(function () {

        controller = $controller('Controller', {
            $scope: $scope,
            $stateParams: $stateParams,
            $state: $state
        });

        // And add $scope's spyOns
        spyOn($scope, 'callOne').and.callThrough();
        spyOn($scope, 'callTwo').and.callThrough();
        spyOn($scope, 'callThree').and.callThrough();
        spyOn($scope, 'callFour').and.callThrough();
    });

起初我尝试了下面的方法,当然没有用;它说没有调用间谍。

        it("should call callTwo if stateParams.index is -1", function () {
            $stateParams.Index = -1;
            expect($scope.callTwo()).toHaveBeenCalled();
        });

我认为所有初始化都发生在我的间谍连接之前,所以我尝试将这些东西移到我的 it 调用中,但一切都崩溃了。

这个说 callTwo 已经被监视了。

    it("should call callTwo if stateParams is -1", function () {
            $stateParams.Index = -1;
            spyOn($scope, 'callTwo').and.callThrough();

            controller = $controller('Controller', {
                $scope: $scope,
                $stateParams: $stateParams,
                $state: $state
            });

            expect($scope.callTwo).toHaveBeenCalled();
        });

但是如果我在控制器初始化后移动间谍声明,它会说它不会再次调用

  1. 如何确保在控制器实例化期间按预期进行调用?

不确定这是否是最佳解决方案,但目前没有想到其他解决方案,这绝对有效。

您可以为每个此类测试设置一个 describe,因为 $stateParams 是在您创建控制器时注入的。这就是为什么在 it 中这样做是不够的,因为当时的 $scope 属于已经创建的控制器。

所以你需要:

describe('Controller tests for when Index === -1', function () {

    beforeEach(function (...) {

        $stateParams.Index = -1; 

        controller = $controller('Controller', {
             $scope: $scope,
             $stateParams: $stateParams,
             $state: $state
        });
    }

    // it tests for Index === -1 case
});

所以在这个例子中,你将要进行的所有 it 测试都保证有 $stateParams === 1。同样适用于您的其他价值观。