2016-11-28 2 views
0

Selon mon exigence, nous devons écrire des spécifications de test pour les touches de raccourci (disons shift + 1 + L - télécharger le fichier) .Dans ma méthode j'ai écrit quelque chose comme ci-dessouscomment définir keyCode ou lesquelles ou propriétés de clé ou de code pour l'événement de clavier

public static SHIFTKEY  : number = 16; 
    this.keys = {}; 

    document.addEventListener('keydown', (event: KeyboardEvent) => { 
    var code = event.which ? event.which : event.keyCode; 
    if (code === KeyCodeConst.SHIFTKEY || (this.keys[KeyCodeConst.SHIFTKEY] && trackedKeys[code])) { 
    if (!this.keys[code]) { 
    this.keys[code] = true; 
    this.keysCount++; 
    } 
    if (this.keysCount === 3) { 
     alert('call the method which is required'); 
    } 
    } 
    if (!trackedKeys[code]) { 
    this.keysCount = 0; 
    } 
    }); 

maintenant, dans mon fichier spec je suis en train d'écrire un test pour cela comme ci-dessous

 describe('Add Event Listener',() => { 
      beforeEach(() => { 
       viewModel = new viewModel(); 
       spyOn(window, 'addEventListener').and.callThrough(); 
      }); 
      it('check the combination of keys are called',() => { 
       keyPress(16); 
       keyPress(49); 
       keyPress(76); 
       expect(viewModel.keys[KeyCodeConst.SHIFTKEY]).toBeTruthy();   
      }); 
      function keyPress(keyCodeVal) { 
       var keyboardEvent = document.createEvent('KeyboardEvent'); 
       try { 
        Object.defineProperty(keyboardEvent, 'keyCode', {'value': keyCodeVal}); 
       } catch (err){ 
        console.log(err); 
       } 
       keyboardEvent.initKeyboardEvent('keydown',true,false,window,'',0,'',false,''); 
       document.body.dispatchEvent(keyboardEvent); 
      } 
     }); 

Pendant l'exécution de la construction, je reçois une erreur comme ci-dessous et il donne une erreur de construction comme ci-dessous

Attempting to change value of a readonly property. 
    at defineProperty (--some url--) 
    at keyPress (--some url--) 

Existe-t-il un moyen d'envoyer la valeur de touche enfoncée à la méthode, à l'exception de keyCode ou de qui? Conformément aux directives MDN j'ai observé que ce sont des attributs en lecture seule. J'ai essayé d'utiliser la clé, mais cela n'a pas fonctionné.

Répondre

0

Pour tester votre méthode sans déclencher réellement un événement de clavier, vous pouvez séparer la logique de l'extraction de la touche enfoncée de votre fonction et dans vos tests, l'alimenter avec les codes de touches que vous souhaitez tester.

Pour tester réellement keydown événements, essayez cette fonction qui prend l'élément à envoyer l'événement à keydown et la valeur keyCode (ajusté à fantôme js):

function triggerKeyDown(element, value) { 
     var e = document.createEvent('KeyboardEvent'); 
     e.initEvent('keydown', true, false); 
     Object.defineProperty(e, 'keyCode', {'value': value}); 
     element.dispatchEvent(e); 
    } 
+0

merci. Pour tester les événements keydown, j'ai besoin de créer un élément avant chaque chose. Quelque chose comme ceci - $ ('body'). Append (""); qui ne servira pas mon but – Krishna

+0

'triggerKeyDown (document.body, 11)' devrait fonctionner – DevDig

+0

La propriété 'KeyboardEvent' n'existe pas sur le type 'Window' .-- Je reçois cette erreur. J'ai vérifié que la bibliothèque n'existait pas. – Krishna