在我们的应用程序中,我们有几层嵌套指令。我试图写一些单元测试的顶级指令。我嘲笑了指令本身需要的东西,但现在我从低级指令运行错误。在我对顶级指令的单元测试中,我不想担心低级指令发生了什么。我只是想嘲笑较低级别的指令,基本上它没有做任何事情,所以我可以测试顶级指令隔离。
@H_403_10@
由于执行了指令注册,似乎不可能用嘲笑的指令替换现有指令。
我试过覆盖指令定义,做这样的事情:
angular.module("myModule").directive("myLowerLevelDirective",function() { return { link: function(scope,element,attrs) { //do nothing } } });
但是,这不会覆盖它,它只是运行这个除了真正的指令。如何阻止这些低级指令在我的单元测试中执行顶级指令?
但是,您有几种方法来单元测试较高级别的伪指令,而不受较低级别伪指令的干扰:
1)不要在单元测试模板中使用下级指令:
如果您的较低级别的指令没有被更高级别的指令添加,在您的单元测试中使用一个只有高级指令的模板:
var html = "<div my-higher-level-directive></div>"; $compile(html)(scope);
所以,较低级别的指令不会干扰。
2)在指令实现中使用服务:
angular.module("myModule").directive("myLowerLevelDirective",function(myService) { return { link: myService.lowerLevelDirectiveLinkingFunction } });
然后,您可以在您的单元测试中模拟此服务,以避免干扰您的更高级别的指令。如果需要,这个服务甚至可以提供整个指令对象。
3)您可以使用终端指令覆盖您的下级指令:
angular.module("myModule").directive("myLowerLevelDirective",function(myService) { return { priority: 100000,terminal: true,link: function() { // do nothing } } });
使用终端选项和更高的优先级,您的实际低级指令将不会被执行。更多信息在directive doc。
看看它在这个Plunker如何工作。