2016-11-28 7 views
0

私の要求に応じて、ホットキーのテスト仕様を書く必要があります(シフト+ 1 + L - アップロードファイル)。私の方法では、私のspecファイルで今すぐキーボードイベントのkeyCodeまたはキーまたはコードプロパティを定義する方法

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

以下のようなもの、私はビルドを実行している間

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

keyCodeまたはwhichを除いて、メソッドに押されたキー値を送信できる方法はありますか? MDNガイドラインによると、これらは読み取り専用の属性であることがわかりました。キーを使用しようとしましたが機能しませんでした。

答えて

0

キーダウンイベントを実際にトリガーすることなくメソッドをテストするには、押されたキーを関数から外し、テストでテストしたい押されたキーコードをフィードするだけのロジックを分離することができます。

は、実際には(ファントム-JSに調整)に​​イベントとkeyCode値をディスパッチする要素を取得、この機能を試して、​​イベントをテストする:

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'は 'Window'型に存在しません。私は存在しなかったライブラリをチェックした。 – Krishna

関連する問題