如何在指令上模拟内联控制器?

时间:2014-12-05 02:07:13

标签: angularjs jasmine

测试时,您可以使用angular.module(...).controller('MyCtrl')模拟已使用$controllerProvider.register('MyCtrl')注册的控制器。

但是如何在指令上模拟内联控制器呢?

function MyCtrl() {

}

function MyDir() {
    return {
        restrict: 'E',
        controllerAs: 'myCtrl',
        controller: MyCtrl,
        template: '<div>hi</div>',
    };
}

2 个答案:

答案 0 :(得分:0)

没有真正hacky的东西是不可能的。相反,将控制器声明为正常,并按名称从指令引用它。

angular.module(...).controller('MyCtrl')

指令:

return {
    // ...
    controller: 'MyCtrl',
    // ...
};

这也允许您像任何其他控制器一样测试控制器。

答案 1 :(得分:0)

这很晚了,但实际上是可能的:

angular
    .module( 'myModule' )
    .directive( 'myDir', function() {
        return {
            restrict: 'A',
            bindToController: true,
            controllerAs: '$ctrl',
            controller: MyDirController,
            scope: {}
        };
    });

function MyDirController( ... ) { ... }
    
...
    
let myDir = $injector.get( 'myDirDirective' ); //Returns an array of registrations
let $controller = $injector.get( '$controller' );
//Since we expect only a single registration, we can use the first element
let $ctrl = $controller( myDir[0].controller, { /*locals*/}, {/*bindings*/});