单元测试Angular Controller的初始化函数

时间:2016-03-02 07:29:08

标签: angularjs unit-testing controller initialization karma-jasmine

我面对的是我认为非常简单的场景,但我找不到一个明确的答案:我有一个控制器在创建时做了很多事情,包括一些复杂的东西,所以我创建了一个初始化函数这样做。

这是控制器代码的样子:

function MyCtrl() {
    function init() {
            // do stuff
    }
    var vm = this;
    vm.init = init;
    vm.init();
}

显然,我想单元测试init(),但我找不到这样做的方法:当我在我的测试中实例化控制器时,init()运行一次,这使得很难正确测试它的侧面 - 当我第二次运行它时会产生影响。

我正在使用karma-jasmine进行测试,通常做这样的事情:

describe('Controller: MyCtrl', function () {
    var myCtrl;
    beforeEach(angular.mock.module('myApp'));
    beforeEach(inject(function ($controller, $rootScope) {
        $scope = $rootScope.$new();
        createController = function () {
            return $controller('MyCtrl', {$scope: $scope});
        };
    }));
    it('bleh', function() {
        myCtrl = createController();
        // init has already been run at that point
    });
)};

同样,我确信它真的很简单,我只是忽略了这一点,但我仍然是Angular的新手。非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

将JB Nizet的答案放在这里而不是评论中。

非常感谢您的回答!

  

这是鸡和蛋的问题:构造函数调用init,你需要调用构造函数来调用你的init函数。我仍然认为你有一个或几个由构造函数调用的“私有”函数的事实是一个实现细节。你真正想要测试的是构造函数完成它的工作。您可以通过委托服务功能(可以进行单元测试,并在测试控制器时进行模拟)来简化这一过程。