angularjs – 如何使用DOM操作正确单元测试指令?

前端之家收集整理的这篇文章主要介绍了angularjs – 如何使用DOM操作正确单元测试指令?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在问我真正的问题之前,我有一个不同的…在Angular指令中单元测试DOM操作是否有意义?

例如,这是我完整的链接功能

  1. function linkFn(scope,element) {
  2. var ribbon = element[0];
  3. var nav = ribbon.children[0];
  4.  
  5. scope.ctrl.ribbonItemClick = function (index) {
  6. var itemOffsetLeft;
  7. var itemOffsetRight;
  8. var item;
  9.  
  10. if (scope.ctrl.model.selectedIndex === index) {
  11. return;
  12. }
  13.  
  14. scope.ctrl.model.selectedIndex = index;
  15.  
  16. item = nav.querySelectorAll('.item')[index];
  17.  
  18. itemOffsetLeft = item.offsetLeft - ribbon.offsetLeft;
  19. itemOffsetRight = itemOffsetLeft + item.clientWidth;
  20.  
  21. if (itemOffsetLeft < nav.scrollLeft) {
  22. nav.scrollLeft = itemOffsetLeft - MAGIC_PADDING;
  23. }
  24.  
  25. if(itemOffsetRight > nav.clientWidth + nav.scrollLeft) {
  26. nav.scrollLeft = itemOffsetRight - nav.clientWidth + MAGIC_PADDING;
  27. }
  28.  
  29. this.itemClick({
  30. item: scope.ctrl.model.items[index],index: index
  31. });
  32.  
  33. $location.path(scope.ctrl.model.items[index].href);
  34. };
  35.  
  36. $timeout(function $timeout() {
  37. var item = nav.querySelector('.item.selected');
  38. nav.scrollLeft = item.offsetLeft - ribbon.offsetLeft - MAGIC_PADDING;
  39. });
  40. }

这是一个可滚动的选项卡组件,我不知道如何测试nav.scrollLeft = x的3个实例。

当单个项目(仅部分可见)时,前两个if语句发生。左/右(每个if)项将被卡扣到组件的左/右边界。

第三个是将所选项目放置在视图中,如果在加载组件时不可见。

如何用Karma / Jasmine进行单元测试。这样做还是有意义的,还是应该用量角器进行功能测试?

测试指令时,查找设置或返回显式值的内容。这些通常易于断言,并且使用Jasmine和Karma进行单元测试是有意义的。

看看Angular的tests for ng-src.在这里,他们测试该指令的工作原理是断言元素上的src属性被设置为正确的值。它是明确的:src属性有一个特定的值,或者它没有。

  1. it('should not result empty string in img src',inject(function($rootScope,$compile) {
  2. $rootScope.image = {};
  3. element = $compile('<img ng-src="{{image.url}}">')($rootScope);
  4. $rootScope.$digest();
  5. expect(element.attr('src')).not.toBe('');
  6. expect(element.attr('src')).toBe(undefined);
  7. }));

ng-bind相同。这里,他们将一串HTML传递给$编译器,然后声明返回值的HTML填充了实际的范围值。再次,这是明确的。

  1. it('should set text',$compile) {
  2. element = $compile('<div ng-bind="a"></div>')($rootScope);
  3. expect(element.text()).toEqual('');
  4. $rootScope.a = 'misko';
  5. $rootScope.$digest();
  6. expect(element.hasClass('ng-binding')).toEqual(true);
  7. expect(element.text()).toEqual('misko');
  8. }));

当您进入更复杂的场景,例如测试视口可见性或测试特定元素是否位于页面上正确的位置时,您可以尝试测试CSS和样式属性设置正确,但是它的速度非常快,不会推荐的。此时您应该查看量角器或类似的e2e测试工具。

猜你在找的Angularjs相关文章