angularjs - 手动触发输入字段的 Angular 数据绑定(bind)(仅用于单元测试目的)

标签 angularjs angularjs-directive angularjs-scope

我正在为 Angular 指令编写一些测试,我需要模拟用户输入到输入字段中。我尝试这样做:

element.find('input').val('some value').trigger('input');

但是没有成功。触发 change 也不起作用。我知道我可以直接使用 element.scope() 访问元素范围并更改它,但更改输入的值并让 Angular 进行数据绑定(bind)似乎更自然。

就其值(value)而言,我已经从 Angular ngScenario 中查看了 input(name).enter(value),它的作用似乎与我相同:

...
input.val(value);
input.trigger(event || (supportInputEvent ? 'input' : 'change'));
...

我错过了什么?在这种情况下有更好的方法来测试用户输入吗?

(我做了 a jsFiddler script 来说明问题)

更新

我认为有必要进行一些澄清。我并不想改变 DOM 或 Angular 领域之外的范围本身。我有一个指令,它呈现一个绑定(bind)到该指令范围的属性的输入框。我正在编写自动化测试,以确保指令执行其应该执行的操作,而一个测试应该做的是模拟某些输入,以便指令范围得到更新,并且我可以断言对该输入执行某些行为。正如我之前提到的,我可以使用 element.scope() 从测试代码中更改指令的范围,但我宁愿更改输入的值并让 Angular 完成它的工作。

最佳答案

花了更多时间研究和测试后,我发现了问题所在:jqLit​​e 使用 addEventHandler 注册事件处理程序,并且它们不会被 jQuery trigger 触发> 功能。我的 jsFiddle 脚本无法正常工作,因为 Angular 的脚本是在 jQuery 之前加载的(因此使用的是 jqLit​​e)。我更新了the script以正确的顺序加载所有内容,以便 Angular 使用 jQuery on 函数来注册事件处理程序,现在它模拟输入框上的更改并告诉 Angular 进行数据绑定(bind)。

出于同样的原因,我的测试代码无法正常工作。我也通过更改脚本顺序来修复它。如果我没有碰巧使用 jQuery,则必须通过调用 dispatchEvent 而不是 trigger 来触发事件。

关于angularjs - 手动触发输入字段的 Angular 数据绑定(bind)(仅用于单元测试目的),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17939739/

相关文章:

javascript - 使用菜单偏移量自定义 Angular SlideAndPush 指令

angularjs - 当更新一个指令中需要反射(reflect)在另一指令中的数据时,使用 $apply 是一种不好的做法吗?

datetime - 将 bootstrap-datetime 选择器与 AngularJS 结合使用

javascript - 使用 $scope AngularJS 仅显示数组中的最新值

angularjs - 使用 AngularJs 从数据绑定(bind)的 JSON 列表中删除项目

javascript - AngularJS ui-router $state.go ('^' ) 仅更改地址栏中的 URL,但不加载 Controller

angularjs - 表情符号和其他 unicode 字符在 Angular 中未正确显示

javascript - $http 获取参数不起作用

javascript - 无法插入对象属性内部的数组

javascript - 从内容脚本触发 Angular 函数?