0

我正在使用 Jasmine 和 Karma 作为我的测试运行器为 AngularJS 中的指令编写一些单元测试。当我这样做时,我想知道我是否正在遵循设置它的最佳方法,并希望有人能帮助我。

如果我的指令通过 templateUrl 使用模板,最好是导入实际模板,这已被证明有点棘手,还是使用 $templateCache 插入模板的模拟并做出我的断言?对于单元测试,在我看来,创建模拟是最好的选择,因为它避免了引入额外的资源,而这些资源会使单元测试变得混乱。

此外,我在单个 DOM 元素中搜索时遇到问题,并且一直在使用 element.text() 来搜索绑定到 DOM 的内容。我见过的很多示例都使用这种方法来搜索内容,但我想知道是否有一种方法可以使用诸如 getElementById() 之类的方法来隔离 DOM 的各个部分并根据小部分进行断言一次。

假设我有以下元素作为我的模板:

    <div>
    <div id = "one">data1</div>
    <div id = "two">data2</div>
    </div>

我把它编译成一个angular.element。如果我做类似element.getElementById("one").innerHTML它什么也不做。element.text("data1") 会找到值,但它不是很具体。

谢谢

4

1 回答 1

2

问题是该指令旨在将用户、DOM 和范围绑定在一起。所有范围处理都应在控制器内完成(可能通过controller:属性绑定到您的指令)。

因此,您应该为您的控制器单独进行单元测试,甚至无需触及指令部分。然后你应该测试你的指令。由于它主要是关于 DOM 处理,您可能想要测试您的真实模板,而不是模拟模板。

为了获取元素,您可以根据需要使用find()方法。如果你根本不使用 jQuery,你可以在单元测试和使用中加载它(在你的 AngularJs 依赖之前)element.find('#one'),例如。所有 AngularJs元素都是扩展的 jQuery 元素,如果您的项目中没有 jQuery,那么 Angular 使用 jQLite,您将不会实现选择器。

另外,看看这里。我在此答案中提供了有关如何测试指令的更多详细信息。

于 2013-07-15T18:03:11.443 回答