我是新的angularjs和试图单元测试我的指令。实际上,我首先在一个完全工作的浏览器会话中测试了它,因为它看起来更容易,但我想进入单元测试,因为它是最佳实践。
在我的浏览器会话中,我的指令完全像我期望的那样起作用。它创建了一个<select>
标签,该标签使用ng-model
绑定到$rootScope
上的属性。
然而,当我使用Jasmine语法测试Karma时(正如Angular文档所推荐的),当我更改<select>
元素的值时,我无法获得$rootScope
上的模型更新。
这是我的Jasmine代码。这是一个代码片段,但我向您保证,下面代码中没有显式定义的变量是使用$inject()
正确定义的。我已经测试了他们,以确保他们没有搞砸:
var el = $compile("<my-directive my-model='myModel'></my-directive>")($scope);
//the 'my-model' value, 'myModel', gets assigned during the link phase to:
//$scope.$root.fields[myModel]
var $el = angular.element(el);
$el.find('select').val('someVal');
$rootScope.$digest();
expect($scope.$root.fields[myModel]).toEqual("someVal");
我得到的错误是:
Expected '' to equal 'someVal'
我做错了什么?我是否误解了$digest()
阶段?或者ng-model
是如何工作的?
好吧,我想我会回答我自己的问题,因为我在这里等待答案时发现了它。
问题是我需要调用.change()
,或者在select元素上触发change
事件。
所以我今天学到了一些重要的东西!Angular的ng-model
指令只会在事件被触发后接收变化。在测试中学习比在调试中学习好,所以我猜单元测试是有效的!