我开始使用Karma和Jasmine,我遇到了问题。
HTML:
<input id="dateTimePicker" ng-change="vm.enableConfirm = vm.matchDate == null" ng-click="vm.openCalendar($event, prop)" type="text" datetime-picker="dd MM yyyy HH:mm" ng-model="vm.matchDate" is-open="vm.isOpen" />
我想测试执行ng-click时是否打开日历。
控制器代码:
vm.openCalendar = function (e) {
e.preventDefault();
e.stopPropagation();
vm.isOpen = true;
};
Spec.js:
...
it('Check if openCalendar opens the calendar', function () {
angular.element(document.querySelectorAll('#dateTimePicker')).triggerHandler('click');
controller.openCalendar();
//nothing yet
});
...
我收到openCalendar没有获取事件参数的错误。如何正确测试此控制器功能?
答案 0 :(得分:0)
对于任何需要模拟参数的函数都是一样的,而不仅仅是事件处理程序。
在一个规范controller.openCalendar
中进行了测试:
var e = {
preventDefault: jasmine.createSpy(),
stopPropagation: jasmine.createSpy()
};
controller.openCalendar(e);
expect(e.preventDefault).toHaveBeenCalled();
expect(e.stopPropagation).toHaveBeenCalled();
expect(controller.isOpen).toBe(true);
在另一个规范中,视图使用存根controller.openCalendar
进行测试:
spyOn(controller, 'openCalendar');
element.click();
expect(controller.openCalendar).toHaveBeenCalledWith(jasmine.any(Object), ...);
element
是使用input
编译的$compile
元素。在测试中,DOM元素是分离的,document.querySelectorAll
无法访问。