2016-11-28 2 views
0

Laut meiner Anforderung müssen wir Testspezifikationen für Hotkeys schreiben (sagen shift + 1 + L - Datei hochladen) .In meiner Methode habe ich geschrieben so etwas wie untenwie KeyCode oder welche oder Schlüssel oder Code Eigenschaften für Tastaturereignis zu definieren

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; 
    } 
    }); 

Jetzt in meinem spec-Datei ich versuche, einen Testfall dafür, wie unter

 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); 
      } 
     }); 

zu schreiben, während die Build ausgeführt wird, ich eine Störung erhalte wie unten, und es wird zu geben ein Buildfehler wie unten

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

Gibt es einen Weg, wo wir den gedrückten Schlüsselwert an die Methode senden können, außer keyCode oder welche. Gemäß den MDN-Richtlinien habe ich festgestellt, dass es sich um schreibgeschützte Attribute handelt. Ich habe versucht, den Schlüssel zu verwenden, aber es hat nicht funktioniert.

Antwort

0

Um Ihre Methode zu testen, ohne tatsächlich ein Keydown-Ereignis auszulösen, können Sie die Logik trennen, um die gedrückte Taste aus Ihrer Funktion zu entfernen, und in Ihren Tests nur die gedrückten Tastencodes eingeben, die Sie testen möchten.

Um zu testen, tatsächlich keydown Ereignisse, versuchen Sie diese Funktion, die das Element nimmt das keydown Ereignis und den keyCode Wert (Phantom-js eingestellt) Versandfertig:

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

Dank. Um die Keydown-Ereignisse zu testen, muss ich vor jedem ein Element erstellen - $ ('body'). Append (""); was nicht meinem Zweck dient – Krishna

+0

'triggerKeyDown (document.body, 11)' sollte funktionieren – DevDig

+0

Eigenschaft 'KeyboardEvent' existiert nicht auf Typ 'Window' .-- Ich bekomme diesen Fehler. Ich überprüfte die Bibliothek, die es nicht gab. – Krishna

Verwandte Themen