【问题标题】:Angular unit testing initialize "nameless" controller in directive角度单元测试在指令中初始化“无名”控制器
【发布时间】:2016-01-08 14:30:59
【问题描述】:

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

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 ...) 错误,所以我认为我没有正确初始化控制器。我主要想知道这样的东西是否可以在完全不更改指令源代码的情况下进行单元测试。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 恕我直言,这就是答案,我已经做了几年的测试,包括 2 次针对 Angular 本身。尝试做一些不同的事情会给你带来很多挫败感,并得出结论认为这是最好的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多