Angularjs 单元测试未对来自 SELECT 节点的数据建模
Angularjs Unit Tests not modeling data from SELECT node
我是 angularjs 的新手,正在尝试对我的指令进行单元测试。实际上,我首先在完全工作的浏览器会话中对其进行了测试,因为它看起来更容易,但我想进行单元测试,因为这是最佳实践。
在我的浏览器会话中,我的指令完全按照我的预期运行。它创建一个 <select>
标签,该标签使用 ng-model
绑定到 $rootScope
.
上的 属性
但是,当我使用 Jasmine 语法测试 Karma 时(如 Angular 文档所推荐的那样),当我更改 $rootScope
的值时,我无法在 $rootScope
上获得模型更新<select>
元素。
这是我的 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
指令只会在触发事件后获取更改。学习测试比调试好,所以我想单元测试有用!
我是 angularjs 的新手,正在尝试对我的指令进行单元测试。实际上,我首先在完全工作的浏览器会话中对其进行了测试,因为它看起来更容易,但我想进行单元测试,因为这是最佳实践。
在我的浏览器会话中,我的指令完全按照我的预期运行。它创建一个 <select>
标签,该标签使用 ng-model
绑定到 $rootScope
.
但是,当我使用 Jasmine 语法测试 Karma 时(如 Angular 文档所推荐的那样),当我更改 $rootScope
的值时,我无法在 $rootScope
上获得模型更新<select>
元素。
这是我的 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
指令只会在触发事件后获取更改。学习测试比调试好,所以我想单元测试有用!