加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

单元测试 – 你如何模拟指令以启用高级指令的单元测试?

发布时间:2020-12-17 08:57:51 所属栏目:安全 来源:网络整理
导读:在我们的应用程序中,我们有几层嵌套指令。我试图写一些单元测试的顶级指令。我嘲笑了指令本身需要的东西,但现在我从低级指令运行错误。在我对顶级指令的单元测试中,我不想担心低级指令发生了什么。我只是想嘲笑较低级别的指令,基本上它没有做任何事情,
在我们的应用程序中,我们有几层嵌套指令。我试图写一些单元测试的顶级指令。我嘲笑了指令本身需要的东西,但现在我从低级指令运行错误。在我对顶级指令的单元测试中,我不想担心低级指令发生了什么。我只是想嘲笑较低级别的指令,基本上它没有做任何事情,所以我可以测试顶级指令隔离。

我试过覆盖指令定义,做这样的事情:

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如何工作。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读