Angular-模拟覆盖父指令并模拟它

Angular-Mock override parent directive and mock it

我正在尝试模拟驻留在其父模块的同一模块上的指令。 因为我想将测试隔离到子指令,所以我试图模拟父指令。 如果它们都驻留在不同的模块上,那将是很容易实现的,但由于它们在同一个模块上,我得到多个具有相同名称的指令。 为了绕过它,我试图在我的模拟指令中加入这样的东西:

        return {
                priority: 100,
                terminal:true,
                restrict:'CE',
                scope:{
                    zoom:'@'
                },
                template:'<div ng-transclude></div>',
                controllerAs:'parentController',
                controller:mockController,
                transclude: true
            };

问题是虽然我可以这样做覆盖父指令,但永远不会调用子指令,因为它具有较低的优先级并且终端将停止执行。

我正在寻找的是一种在 karma-jasmine 上测试并使用 angular.mock.

时覆盖指令定义的方法

当您添加一个指令时,它会自动创建一个工厂并将指令放在一个数组中,这样多个指令就可以响应相同的标记。

This person 通过创建一个名为 directive.Unfortunately 的服务来使其工作,这可能是由于 angular 的更改,他的解决方案尚未为我解决因为 angular 在指令和 $$moduleName 上要求一个 $$bindings 键,将它们添加到工厂解决了它。

我是这样模拟的:

    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

上的指令的唯一方法