2013-09-05 7 views
5

まず、テスト駆動型開発(TDD)と動作駆動型開発(BDD)の両方に新しく、このページは開発が必要なことが多いため、Webページを開発する良い方法だと信じていますあなたが何かできるようになる前にテストコードを開発しなければならないのなら、それは難しいです。関数が値を返さない場合、Jasmineはどのように機能しますか?

私がこのスレッドを書いているのは、なぜ私が見つけたのかという問題ではありません。しかし、もしあなたが入力しているのであれば、それも読んで楽しむでしょう!私は構文について、それがどのように動作するのか、そのすべてについて何かを読んできました。私は、私の関数が値を返さなければ、実装するのは難しいということを発見しました。

のiは、クリックイベントを持っていることを例えば言おうが、単に入力のテキスト値を変更する機能をトリガ:

$('input[type="text"]').click(function() { 
    $(this).val('Oh, that tickles!'); 
}); 

どうジャスミンがこれを処理しますか?次のコードのように:

describe('Input type text is clicked', function() { 
    it('changes text in the input field', function() { 
     expect($('input[type="text"]').val()).toEqual("Oh, that tickles!"); 
    }); 
}); 

これは間違っていますが、jQueryオブジェクトにはその値を含まない複数の入力フィールドが含まれる可能性があるためです。要素(例えば$(this)など)を見つける方法はありますか、またはジャスミンテストの中にクリックハンドラを置く必要がありますか?このように:

describe('Input type text is clicked', function() { 
    it('changes text in the input field', function() { 
     $('input[type="text"]').click(function() { 
      expect($(this).val()).toEqual("Oh, that tickles!"); 
     } 
    }); 
}); 

いくつかの明快さは、多くの事前での素敵な:)

おかげだろう!

/J。

+0

私はこれも苦労しています。しかし、私は 'ロジック'を行い、戻り値を返す関数にすべてを入れ、残りの部分をjqueryイベントで処理します。私は関数をテストするだけです。 –

+0

Ofc、これも解決策です。イベントの中でコードをテストしたい(通常は値を返さない)時がありますが、すべてがあります。 Xn.sの答えはとても役に立ちました。 :) –

答えて

3

1つの方法は、テストの実行時にテキスト入力フィールドが1つだけであることを確認することです。あなたは、入力フィールドでフィクスチャを作成するためにjasmine-jqueryを使用することができます。

describe('Input type text is clicked', function() { 
    beforeEach(function() { 
    jasmine.getFixtures().set('<input type="text" />'); 
    bindClickEvent(); 
    }); 
    it('changes text in the input field', function() { 
    $('input[type="text"]').click(); 
    expect($('input[type="text"]').val()).toEqual("Oh, that tickles!"); 
    }); 
}); 

あなたはクリックイベントを別々にクリックハンドラ自体に処理されていることをテストすることができますので、あなたのコードをリファクタリングすることもできます。

var eventHandlers = { 
    tickle: function() { 
    $(this).val('Oh, that tickles!'); 
    } 
};  
$('input[type="text"]').click(eventHandlers.tickle); 

あなたは2つのテストを受けるでしょう:

describe('Input type text is clicked', function() { 
    beforeEach(function() { 
    jasmine.getFixtures().set('<input type="text" />'); 
    spyOn(eventHandlers, 'tickle'); 
    bindClickEvent(); 
    }); 
    it('should tickle the field', function() { 
    $('input[type="text"]').click(); 
    expect(eventHandler.tickle).toHaveBeenCalled(); 
    }); 
}); 

describe('eventHandlers.tickle', function() { 
    it('should set the field value', function() { 
    var input = $('<input type="text"/>'); 
    eventHandlers.tickle.call(input); 
    expect(input.val()).toBe("Oh, that tickles!"); 
    }); 
}); 
+0

これは非常に役に立ちました。しかし、これはあなたのテストのための開発にかなりの時間を置く必要があることを確認します。あなたが大規模に発展する時は本当に価値があるのですか? –

+2

少しやっているので時間がかかりません。既存の大規模なコードベースの仕様を書き始めるなら、簡単に書くことができれば簡単です。次に、最も複雑な領域に移動します。テストが特に難しい場合は、コードが複雑すぎる可能性があり、リファクタリングのメリットがあることがわかります。テストカバレッジの向上に伴い、コード品質が向上するはずです。アプリケーションの仕組みをより詳細に指定するように仕様が増えるにつれ、それらはどちらも貴重なドキュメントとして役立ち、回帰バグを減らすことができます。 –

+0

それは実際に私にとって理にかなっています。ご協力いただきありがとうございます! –

関連する問題