我正在尝试模拟一个驻留在它父母的同一模块上的指令。 因为我想将测试隔离到只有child指令我试图模拟父。 如果它们都位于不同的模块上,那么它们将很容易实现,但由于它们是相同的,因此我得到了多个具有相同名称的指令。 为了绕过我试图在我的模拟指令上添加这样的东西:
return {
priority: 100,
terminal:true,
restrict:'CE',
scope:{
zoom:'@'
},
template:'<div ng-transclude></div>',
controllerAs:'parentController',
controller:mockController,
transclude: true
};
问题在于,虽然我可以覆盖父指令,但是从不调用子指令,因为它具有较低的优先级,终端将停止执行。
我正在寻找的是一种在karma-jasmine上测试并使用angular.mock时覆盖指令定义的方法。
答案 0 :(得分:2)
当你添加一个指令时,它会自动创建一个工厂并将指令放在一个数组上,这样多个指令就可以响应同一个标记。
This person有一种方法可以通过创建一个带有指令名称的服务来使其工作。不幸的是,可能由于角度变化,他的解决方案并没有为我解决它因为角度要求$指令上的$ bindings键和$$ moduleName,将它们添加到工厂解决了它。
我让它像这样嘲笑:
angular.mock.module('theModuleIWantToTest');
angular.mock.module(function($provide){
$provide.factory('mockParentDirective', function(){
var directive={
priority:0,
name:'mockParent',
restrict:'CE',
scope:{
zoom:'@'
},
template:'<div ng-transclude></div>',
controllerAs:'mockParentController',
controller:mockController,
transclude: true,
$$moduleName:'theModuleIWantToTest',
$$bindings:{}
};
return [directive];
}
);
});
其中mockParent是我想要覆盖的先前声明的指令。
我不认为这是最好的方法,但目前我发现它是覆盖Angular 1.4.2指令的唯一方法