Как проверить 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);
});
});
Однако.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);
}
});
};
}
]);
2 ответа
Вы должны запустить событие прокрутки для вашего элемента вручную в тесте:
element.find('#test').scrollTop(10000);
element.find('#test').triggerHandler('scroll');
Была такая же проблема в последнее время. Чтобы прокрутка работала, вам нужно установить некоторые размеры в теге body, чтобы окно можно было прокручивать.
var scrollEvent = document.createEvent( 'CustomEvent' ); // MUST be 'CustomEvent'
scrollEvent.initCustomEvent( 'scroll', false, false, null );
var expectedLeft = 123;
var expectedTop = 456;
mockWindow.document.body.style.minHeight = '9000px';
mockWindow.document.body.style.minWidth = '9000px';
mockWindow.scrollTo( expectedLeft, expectedTop );
mockWindow.dispatchEvent( scrollEvent );
К сожалению, это не работает в PhantomJS.
Если вы выполняете свои тесты на Travis CI, вы также можете использовать Chrome, добавив следующее в.travis.yml
before_install:
- export CHROME_BIN=chromium-browser
- export DISPLAY=:99.0
- sh -e /etc/init.d/xvfb start
И пользовательский Chrome Launcher в вашей конфигурации кармы:
module.exports = function(config) {
var configuration = {
// ... your default content
// This is the new content for your travis-ci configuration test
// Custom launcher for Travis-CI
customLaunchers: {
Chrome_travis_ci: {
base: 'Chrome',
flags: ['--no-sandbox']
}
},
// Continuous Integration mode
// if true, it capture browsers, run tests and exit
singleRun: true
};
if(process.env.TRAVIS){
configuration.browsers = ['Chrome_travis_ci'];
}
config.set( configuration );
};