2015-04-03 139 views
3

当在模板内部有一个带有ng-click属性的按钮时,我应该测试实际采取的动作的效果(单击)还是附加到ng -click属性,函数调用?Ng-click - 如何对行为进行单元测试

换句话说,对于一个指令,有这样的一个模板:

<div> 
    <button ng-click="game.start()">start</button> 
</div> 

我应该考什么点击做或做什么game.start功能?

我知道后来函数game.start可以更改为另一个。此外,可以删除ng-click,并以不同的方式捕获点击事件。

用triggerHandler('click')进行单元测试很诱人,但是指令的模板也可以改变。这意味着我需要对DOM节点进行一些“证明”访问,即通过id属性。

为了进行单元测试,我应该在节点上附加id属性吗?还是应该对问题采取不同的解决方法?

+0

那么不会测试点击与game.start函数是一样的吗? – Aaron 2015-04-03 20:01:01

+0

嗯,是的,没有。现在是,但假设我想稍后重构代码,并且我的game.start函数更改为例如game.init。在这样的情况下,我不得不重写我的测试规范。在编写行为测试时,我根本不想这样做。 – 2015-04-04 07:17:47

回答

0

在指令的情况下,我通常会通过dom单击元素。你的情况在这里:

it("performs some action when clicked", function() { 
    element.find("button").click(); 

    assert(something); 
}); 

直接调用处理程序将让你通过的测试,即使你忘记添加ng-click指令,这是不是我通常希望。它还使您可以自由地重新命名处理程序方法,而无需调整测试,从而使其不易变脆。

如果模板变得非常复杂,并且您为了测试而试图添加ID,您可能需要考虑将该指令分解为多个指令。

+0

我有一些不太复杂的模板,但仍然有两到三个按钮和不同的DOM节点。不幸的是,将指令分解为多个编译指令不是我的项目的解决方案:/ – 2015-04-04 07:22:34

+0

然后,我会选择合适的选择器,就像使用css设计按钮时一样。 – user1777136 2015-04-05 20:42:46