Angularjs   发布时间:2022-04-20  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何触发AngularJS指令测试的变化大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_607_0@ 我有以下AngularJS指令创建一个输入元素。输入具有运行doIt()@L_607_2@的ng-change属性。在我的指令单元测试中,我想检查当用户更改输入时是否调用doIt@L_607_2@。但测试没有通过。它在手动测试时在浏览器中工作。

指示:

...
template: "<input ng-model='mymodel' ng-change='doIt()' type='text'>"

测试:

el.find('input').trigger('change') // Dos not trigger ng-change

现场演示(ng-changE):@L_673_7@

现在,如果我手动绑定更改事件而不是使用Ng-change属性,则测试通过。

template: "<input ng-model='mymodel' type='text'>",link: function(scope,element,attrs) {
  element.bind('change',function(event) {
    scope.doIt();
  });
}

现场演示(手动装订):http://plnkr.co/edit/dizuRaTFn4Ay1t41jL1K?p=preview

有没有办法使用变更并使其可测试?谢谢。

从您的解释性评论

ng变化表示的表达是否正确评估是否真的是ngModel指令的责任,所以我不知道我会用这种方式进行测试;相反,我相信,ngModel和ngChange指令已被正确实现和测试,以调用指定的@L_607_2@,只是测试调用@L_607_2@本身以正确的方式影响指令。可以使用端对端或集成测试来处理完整的场景。

也就是说,您可以抓住驱动ngModel更改回调的ngModelController实例,并自行设置视图值:

it('trigger doIt',function() {
  var ngModelController = el.find('input').controller('ngModel');
  ngModelController.$setViewValue('test');
  expect($scope.youDidIt).toBe(true);
});

正如我所说,尽管如此,我觉得这对于ngModel的责任来说太过分了,打破了用自然可组合的指令打黑盒子。

例:http://plnkr.co/edit/BaWpxLuMh3HvivPUbrsd?p=preview

[更新]

在查看AngularJS源码后,我发现以下内容也起作用:

it('trigger doIt',function() {
  el.find('input').trigger('input');
  expect($scope.youDidIt).toBe(true);
});

在某些浏览器中,该事件看起来是不同的;输入似乎适用于Chrome。

例:http://plnkr.co/edit/rbZ5OnBtKMzdpmPkmn2B?p=preview

这是relevant AngularJS code,它使用$ sniffer服务来确定要触发的事件:

changeInputValueTo = function(value) {
  inputElm.val(value);
  browsertrigger(inputElm,$sniffer.hasEvent('input') ? 'input' : 'change');
};

即使这样,我不知道我会用这种方式测试一个指令。

大佬总结

以上是大佬教程为你收集整理的如何触发AngularJS指令测试的变化全部内容,希望文章能够帮你解决如何触发AngularJS指令测试的变化所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。