我正在为 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 完成它的工作。
最佳答案
花了更多时间研究和测试后,我发现了问题所在:jqLite 使用 addEventHandler
注册事件处理程序,并且它们不会被 jQuery trigger
触发> 功能。我的 jsFiddle 脚本无法正常工作,因为 Angular 的脚本是在 jQuery 之前加载的(因此使用的是 jqLite)。我更新了the script以正确的顺序加载所有内容,以便 Angular 使用 jQuery on
函数来注册事件处理程序,现在它模拟输入框上的更改并告诉 Angular 进行数据绑定(bind)。
出于同样的原因,我的测试代码无法正常工作。我也通过更改脚本顺序来修复它。如果我没有碰巧使用 jQuery,则必须通过调用 dispatchEvent
而不是 trigger
来触发事件。
关于angularjs - 手动触发输入字段的 Angular 数据绑定(bind)(仅用于单元测试目的),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17939739/