如何在具有指令控制器的共享范围的控制器中存根方法

时间:2016-03-07 14:15:48

标签: angularjs jasmine

我正在测试指令的控制器,该指令的范围在指令定义对象中设置为false。来自'父'控制器的方法是从指令控制器调用的 - 我无法存根这个方法,因为我无法从我的指令控制器的测试文件中访问它 - 处理这种情况的最佳方法是什么?

非常感谢。

1 个答案:

答案 0 :(得分:0)

您可以预先定义已知方法并将其设置为angular.noop

function ChildController() {
    var _this = this;

    _this.parentMethod1 = angular.noop;
    _this.parentMethod2 = angular.noop;

    _this.childMethod = function() {
        // do some stuff
    };
}

然后,您可以在init期间调用的子项上创建link方法,如果父项存在,则使用父方法替换方法:

// directive definition
.directive('myDirective', function myDirective() {
    return {
        bindToController: true,
        controller: ChildController,
        controlelrAs: 'childController',
        require: ['childController', '^parentController'],
        scope: false,
        link: function (scope, element, attributes, controllers) {
            // controllers[0] = childController
            // controllers[1] = parentController
            controllers[0].init(controllers[1]);
        }
    };
});

// child controller
function ChildController() {
    // ...same as above...
    _this.init = function(parentController) {
        _this.parentMethod1 = parentController.parentMethod1;
        _this.parentMethod2 = parentController.parentMethod2;
    };
}

您还可以使用.controller定义控制器,以使测试更简单(无需使用模拟parentController创建指令)。但这应该得到你所描述的。