角度单元测试初始化​​"无名"指令

时间:2016-01-08 14:31:00

标签: javascript angularjs unit-testing angularjs-directive jasmine

我很好奇我将如何进行单元测试我认为是指令中的匿名控制器。

directive.js

app.directive('directive',
    function() {
        var controller = ['$scope', function($scope) {
            $scope.add = function() { ... };
        }];

        return {
            restrict: 'A',
            scope: {
                args: '='
            },
            templateUrl: '...',
            controller: controller
        };
    }
};

控制器定义为能够进行单元测试吗?我试图用几种不同的方式初始化它。目前我的设置如下:

describe('The directive', function() {
    var element,
        scope,
        controller;

    var args = {
        ...
    }

    beforeEach(module('app'));

    beforeEach(module('path/to/template.html'));

    beforeEach(function() {
        inject(function($compile, $rootScope, $controller) {
            scope = $rootScope.$new();
            scope.args = args;
            element = angular.element('<div directive></div>');
            template = $compile(element)(scope);
            scope.$digest();
            controller = element.$controller;       
        });
    });

    // assertions go here
});

我一直收到TypeError: 'undefined' is not an object (evaluating ...)错误,因此我认为我没有正确初始化控制器。我主要想知道这样的东西是否可以单元测试,而根本不需要改变指令的源代码。

1 个答案:

答案 0 :(得分:2)

我不确定你是否有可能做的事情。但是,我知道有一种更简单的方法,那就是使它成为标准控制器。 (你似乎已经意识到这一点,但值得指出。)

控制器中的逻辑实际上不应该依赖于指令,因此通过创建一个命名控制器,您可以分离关注点,这是一件好事。 You can even see this used in recommended style guides for AngularJS.一旦您正确设置了控制器,您就不会有任何问题进行测试。像这样拆分它也有助于进行适当的依赖注入,从而实现更简单的代码和更简单的测试。