由Yeoman用角度发生器生成的应用程序。
指令:
angular.module('psApp').directive('scrollTop', function () {
return {
restrict: 'A',
scope: true,
template: '<a href="#" ng-click="click()" class="scroll-top"><span class="glyphicon glyphicon-arrow-up"></span> Back to top</a>',
controller: ['$scope', '$element', '$document', function ($scope, $element, $document) {
$scope.click = function () {
$document.scrollTop(0, 500);
};
}]
};
});
测试:
describe('Directive: scrollTop', function () {
// load the directive's module
beforeEach(module('psApp'));
var scope, element;
beforeEach(inject(function ($rootScope, $compile) {
scope = $rootScope.$new();
element = $compile('<div scroll-top></div>')(scope);
scope.$apply();
}));
it('should have "Back to top" as text', inject(function () {
expect(element.html()).toBe('<a href="#" ng-click="click()" class="scroll-top"><span class="glyphicon glyphicon-arrow-up"></span> Back to top</a>');
expect(element.text()).toBe(' Back to top');
element.click();
}));
});
错误:
PhantomJS 1.9.7(Mac OS X)指令:scrollTop应该有“返回顶部”作为文本 TypeError:'undefined'不是函数(评估'element.click()')
我无法理解问题所在。 :(请发布功能代码。
答案 0 :(得分:5)
这不是PhantomJS的缺陷,而是AngularJS中包含的jqLite包的已知限制。它的元素类中没有“click”函数: https://docs.angularjs.org/api/ng/function/angular.element
有两种替代方法可用于测试目的。
使用jqLite的'triggerHandler()'函数来调用click处理程序。但是这种方法会用虚拟事件调用你的处理程序;请参阅triggerHandler的文档。测试代码看起来像:
element.triggerHandler('click');
由于triggerHandler未传递“真实”事件对象,因此您可能需要相应地调整测试。
答案 1 :(得分:3)
由于某些原因,PhantomJS中没有click()函数。这是解决方法:
//Need to create a cross browser click() function no .click() in PhantomJS
function click(el){
var ev = document.createEvent('MouseEvent');
ev.initMouseEvent(
'click',
true /* bubble */, true /* cancelable */,
window, null,
0, 0, 0, 0, /* coordinates */
false, false, false, false, /* modifier keys */
0 /*left*/, null
);
el.dispatchEvent(ev);
}
以下是如何使用它:
it('Should set the month when the month is changed', function(){
var obj = element[0].getElementsByClassName('month_opt')[1];
click(obj);
expect(scope.dt.getMonth()).toEqual(1);
});
答案 2 :(得分:-1)
这不是测试浏览器操作的地方(在这种情况下是点击)。在UNIT测试中,您应该将其测试为隔离,因此测试只需单击作用域中的操作:
$scope.$$childHead.click(); // in test $$childHead is scope of your directive in application
...your assertions here
你要测试的东西,点击浏览器是更多的集成测试,因为你正在测试浏览器中的点击和指令中的响应 - &gt;例如,这对Selenium来说更为重要。