AngularJS Jasmine测试init函数

时间:2015-07-03 14:20:51

标签: angularjs unit-testing jasmine karma-jasmine

我正在尝试从我的控制器的init函数测试函数调用。我基于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();
        });

我认为所有的init都是在我的间谍附加之前发生的,所以我尝试将那些东西移到我的电话中但是一切都崩溃了。

这句话说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. 如何确保在控制器实例化期间按预期进行调用?

1 个答案:

答案 0 :(得分:1)

不确定它是否是最佳解决方案,但目前没有其他任何想法,这肯定有效。

每次此类测试都可以private void PressKey(object sender, KeyPressEventArgs e) { var process = new Thread(this.LoadData); process.Start(); } private void LoadData() { CheckForIllegalCrossThreadCalls = false; this.dgv.ScrollBars = ScrollBars.None; this.dgv.Columns.Clear(); this.dgv.DataSource = MyDataTable; this.dgv.ScrollBars = ScrollBars.Both; } ,因为在创建控制器时会注入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。同样适合你的其他价值观。