如何使用滚动测试AngularJS指令

rya*_*zec 10 testing jasmine angularjs

我有一个无限滚动指令,我试图进行单元测试.目前我有这个:

describe('Infinite Scroll', function(){
  var $compile, $scope;

  beforeEach(module('nag.infiniteScroll'));

  beforeEach(inject(function($injector) {
    $scope = $injector.get('$rootScope');
    $compile = $injector.get('$compile');

    $scope.scrolled = false;
    $scope.test = function() {
      $scope.scrolled = true;
    };
  }));

  var setupElement = function(scope) {
    var element = $compile('<div><div id="test" style="height:50px; width: 50px;overflow: auto" nag-infinite-scroll="test()">a<br><br><br>c<br><br><br><br>e<br><br>v<br><br>f<br><br>g<br><br>m<br>f<br><br>y<br></div></div>')(scope);
    scope.$digest();
    return element;
  }

  it('should have proper initial structure', function() {
    var element = setupElement($scope);

    element.find('#test').scrollTop(10000);

    expect($scope.scrolled).toBe(true);
  });
});
Run Code Online (Sandbox Code Playgroud)

然而.scrollTop(10000); 似乎没有触发任何东西.

是否有单元测试这种类型的功能(我能够单独测试其他指令与类似的交互,如点击元素)?

如果它是相对的,这是无限滚动代码:

angular.module('nag.infiniteScroll', [])
.directive('nagInfiniteScroll', [
  function() {
    return function(scope, elm, attr) {
      var raw = elm[0];

      elm.bind('scroll', function() {
        if (raw.scrollTop + raw.offsetHeight >= raw.scrollHeight) {
          scope.$apply(attr.nagInfiniteScroll);
        }
      });
    };
  }
]);
Run Code Online (Sandbox Code Playgroud)

And*_*rle 7

您必须在测试中手动触发元素上的滚动事件:

element.find('#test').scrollTop(10000);
element.find('#test').triggerHandler('scroll');
Run Code Online (Sandbox Code Playgroud)