2017-08-30 8 views
0

明確にする:私はJQueryのみ純粋なJSを使用していない、私は "enter"キーをブロックするために単体テストに助けが必要です。e.keyCodeブランチで覆われていないjavascript

私はユニットテストに固執しています、私はどのようにaddEventListenerのkeyCode = 13のユニットテストで覆われていないブランチをカバーする方法を図解しようとしている、フォームが、私は単体テストで非常に初心者です、誰かが私を助けることができますか?

ここでコード:

Newsletter.js

var Newsletter = (function() { 
    function Newsletter(handler) { 
    this.handler = handler; 
    this.blockKeyEnter = this.blockKeyEnter.bind(this); 

    this.handler.addEventListener('keypress', this.blockKeyEnter, false); 
    } 

    Newsletter.prototype.blockKeyEnter = function blockKeyEnter(e) { 
    var key = e.charCode || e.keyCode || 0; 
    if (key === 13) { 
     e.preventDefault(); 
    } 
    }; 
} 

Newsletter.spec.js

describe('Newsletter component specification', function() { 
    var form; 

    beforeEach(function() { 

    form = { 
     addEventListener: function() {}, 
    }; 
    }) 

    it('should intercept enter keypress event and prevent it', function() { 
    var event = { 
     keyCode: 13, 
     charCode: 13, 
     preventDefault: sinon.spy() 
    }; 

    var newLetter = new Newsletter(form); 
    newLetter.blockKeyEnter(event); 

    assert(event.preventDefault.called); 
    }); 
} 

私は "分岐がカバーされていない" フルにしようとしているが、私はの欠如進歩のアイデア。

branch_not_covered

+0

ユニットテストのように、論理ORを理解できません。どのように、そして何を使って、これをテストしているのですか? – adeneo

+0

正直言って、単体テストではとても新しいので、どうやってやるのか分からないので、単体テストでアイデアそれは動作します... –

答えて

0

私はあなたの質問を理解していません。

しかし、Enter機能を無効にしたいようですか?

はそれを試してみてください。

jQuery(function() { 
 
     jQuery("#myForm").bind("keypress", function(a) { 
 
      if (a.keyCode == 13) { 
 
\t \t \t \t alert("Enter detected!"); 
 
       return false; 
 
      } 
 
     }); 
 
});
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 
 

 
<form id="myForm"> 
 
<input type="text" /> 
 
<input type="submit" value="Submit"/> 
 
</form>

0

「カバーされていない支店は」あなたのためにテストを書いていない可能な入力があることを語っています。

あなたのテストでは、e.charCodeは真実です(13 == true)。しかし、あなたのアプリケーションコードは、e.charCodeが偽(0''undefinedなど)である可能性があることを示しています。

e.charCodeが偽であり、e.keyCodeが真実である場合はテストしていません。 e.charCodee.keyCodeの両方が偽である場合のテストは書かれていません。これらのシナリオの両方についてテストを書くと、テストではすべてのブランチがカバーされます。

+0

...どのように私は両方のシナリオをテストすることができますか?真剣に私はユニットテストを知らない...これはシナリオを定義/テストする必要があるのは初めてです。 –

+0

基本的にテスト内のコードを複製することでcharCode 13をテストできます。テストの前半では、オブジェクトから 'charCode:13'を削除します。後半では、オブジェクトから 'keyCode:13'を削除してください。 次に、「他のキー押しイベントを傍受しないでください」という全く新しいテストを行います。現在のテストをコピーしてから、keyCodeとcharCodeを別のものに変更してから、すべてのアサーションを無効にします。 – skylize

+0

訂正:2回目の別のテストは、「keyCodeとkeyDownの両方が不足していると傍受してはいけません。あなたの最初のテストをコピーし、keyCodeとcharCodeを完全に削除して( 'undefined'を意味する)、あなたのアサーションをすべて無効にします。 – skylize

関連する問題