2016-11-28 68 views
0

按我的要求,我们需要编写热键测试规格(比如转移+ 1 + L - 上传文件)。在我的方法,我已经写类似下面如何定义键代码或或键盘事件或码性能

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

现在在我的spec文件我试图写一个测试用例这个像下面

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

虽然运行的版本,我得到这样的错误的下方,它给一个生成错误象下面

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

有没有一种方法,我们可以按键值发送给方法,除了键代码或。按照MDN指导方针,我观察到这些属于只读属性。我尝试使用密钥但它不起作用。

回答

0

要测试你的方法,而无需实际触发keydown事件,你可能会单独获得按键你的功能,并在你的测试只是你想测试按键代码给它的逻辑。

实际测试​​事件,试试这个函数,它接受的元素派遣​​事件和keyCode值(调整到幻像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

感谢。为了测试keydown事件,我需要在每个之前创建一个元素。像这样 - $('body')。append(“”);这将不符合我的目的 – Krishna

+0

'triggerKeyDown(document.body,11)'应该工作 – DevDig

+0

属性'KeyboardEvent'在类型'窗口'上不存在 - 我收到此错误。我检查了它不存在的库。 – Krishna