I am trying to write unit test to test my directive. When I invoke keydown event ng-model is not updated. How can I make changes to ng-model from unit test?
My spec file is given below:
describe('validNumber', function () {
var scope, elem, compiled, html, usageScenarioModel, preventDefault, mockedEvent;
var triggerKeyDown = function (element, keyCode) {
mockedEvent = angular.element.Event('keydown');
mockedEvent.which = keyCode;
preventDefault = spy(mockedEvent, 'preventDefault');
element.trigger(mockedEvent);
};
beforeEach(function(){
html = '<input type="number" valid-number ng-model="model.values[0].percentage"/>';
inject(function($compile, $rootScope, _model_){
model = _model_;
scope = $rootScope.$new();
elem = angular.element(html);
scope.model = _model_;
scope.model.values = [{percentage:0}]};
compiled = $compile(elem);
compiled(scope);
scope.$digest();
})
});
it('should disable user to type non-numerical value into field', function(){
triggerKeyDown(elem, 76); //76 is l
verify(preventDefault);
});
it('should enable user to type numerical value into field', function(){
triggerKeyDown(elem, 50); //76 is l
verify(preventDefault);
});
});
validNumber directive allows only numbers to be typed into number box.
module.exports = function () {
function arrayContains(array, value){
for(var i = 0; i < array.length; i++){
if(array[i] === value){
return i;
}
}
return -1;
}
return function(scope, element) {
var keyCode = [8,9,37,39,48,49,50,51,52,53,54,55,56,57,96,97,98,99,100,101,102,103,104,105,110];
element.bind("keydown", function(event) {
if(arrayContains(keyCode, event.which) == -1){
event.preventDefault();
}
});
};
};
UPDATE I updated the test to verify if preventDefault method is called. However this does not work. Both test passes, and the second one is supposed to fail. I also debugged the code and it is executed correctly. Does anybody have idea why method call is not verified as expected?