6

如何对我的指令进行单元测试?

我所拥有的是

angular.module('MyModule').
    directive('range', function() {
        return {
            restrict: 'E',
            replace: true,
            scope: {
                bindLow: '=',
                bindHigh: '=',
                min: '@',
                max: '@'
            },
        template: '<div><select ng-options="n for n in [min, max] | range" ng-model="bindLow"></select><select ng-options="n for n in [min, max] | range" ng-model="bindHigh"></select></div>'
    };
})

在我的单元测试中,我想从一个非常简单的测试开始

describe('Range control', function () {
    var elm, scope;

    beforeEach(inject(function(_$compile_, _$rootScope) {
        elm = angular.element('<range min="1" max="20" bind-low="low" bind-high="high"></range>');

        var scope = _$rootScope_;
        scope.low = 1;
        scope.high = 20;
        _$compile_(elm)(scope);
        scope.$digest();
    }));

    it('should render two select elements', function() {
        var selects = elm.find('select');

        expect(selects.length).toBe(2);
    });
});

这不起作用,因为该指令已在应用程序模块上注册,并且我不想包含该模块,因为这将使我的所有代码configrun代码运行。这将违背将指令作为一个单独的单元进行测试的目的。

我是否应该将所有指令放在一个单独的模块中并仅加载它?或者有没有其他聪明的方法来解决这个问题?

4

3 回答 3

3

编辑:我看到自上次回答以来问题已经改变。

你需要把你的指令放在一个独立的模块中。

例如:

angular.module('MyModule.directives');

要仅测试该模块,您可以像这样在测试中显式加载该模块:

beforeEach(module('MyModule.directives'));

这将加载该模块及其所有依赖项。

请记住在应用程序的 MyModule 定义中将指令模块声明为依赖项:

angular.module('MyModule', ['MyModule.directives', ...]);
于 2013-03-25T22:14:15.103 回答
2

您应该在“youapp.directives”模块中声明所有指令,并将该模块包含在指令测试中。

在你的 app.js

angular.module('myApp', ['myApp.controllers', 'myApp.directives', 'myApp.services', 'myApp.filters']).config(...)

在你的 directives.js

angular.module('myApp.directives', []) .directive(.....)

最后你的directionsSpec.js

describe('directives specs', function() {
    beforeEach(module('myApp.directives'));

    describe('range', function() {
    ...
    });
});
于 2013-03-27T08:35:44.833 回答
0

angular-seed 项目 https://github.com/angular/angular-seed 似乎认为指令应该放在它们自己的模块中,然后是基本应用程序模块的依赖项。

所以指令进入一个名为“myApp.directives”的模块:

angular.module('myApp.directives', []).
  directive('appVersion', ['version', function(version) {
    return function(scope, elm, attrs) {
      elm.text(version);
    };
  }]);

然后基础应用模块添加指令模块作为依赖

// Declare app level module which depends on filters, and services
angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives']).
  config(['$routeProvider', function($routeProvider) {
    $routeProvider.when('/view1', {templateUrl: 'partials/partial1.html', controller: MyCtrl1});
    $routeProvider.when('/view2', {templateUrl: 'partials/partial2.html', controller: MyCtrl2});
    $routeProvider.otherwise({redirectTo: '/view1'});
  }]);

那么他们的测试示例只依赖于指令模块

describe('directives', function() {
  beforeEach(module('myApp.directives'));
etc...

我实际上还没有用你或我的代码尝试过这个,但看起来你主要是在寻找最常见的实践指导。

于 2013-03-26T00:13:13.590 回答