JasmineでJQueryコードを単体テストする最良の方法は何ですか?
私はこの単純なjQueryテストアプリを持っています:
<div id='log'>log goes here</div>
<button id='btnClearLog'>Clear log</button>
<button id='btnAddLog'>Add log</button>
<script>
$(document).ready(function () {
$('#log').empty();
$('#btnClearLog').click(function () {
$('#log').empty();
});
$('#btnAddLog').click(function() {
$('#log').append("<br />something");
});
});
</script>
これは期待どおりに機能します - div#log は、ドキュメントが読み込まれると空になり、クリックすると #log に追加され、#log がクリアされます。
しかし、JQuery コードは HTML ページ内にあるため、これを単体テストすることはできないと思います。
ということで、以下のように書き直しました。
<div id='log'>log goes here</div>
<button id='btnClearLog'>Clear log</button>
<button id='btnAddLog'>Add log</button>
<script>
$(document).ready(function () {
$('#log').tester();
});
</script>
http://starter.pixelgraphics.us/から生成された jQuery プラグイン コードに基づいて、JQuery コードを別のファイルに外部化しました。
(function($){
$.Tester = function(el){
var base = this;
base.init = function(){
$('#log').empty();
$('#btnClearLog').click(function() {
base.clear();
});
$('#btnAddLog').click(function() {
base.add();
});
};
base.clear = function(){
$('#log').empty();
};
base.add = function(){
$('#log').append("<br />something");
};
base.init();
};
$.fn.tester = function(){
return this.each(function(){
(new $.Tester(this));
});
};
})(jQuery);
これも期待どおりに機能します。
ただし、Jasmine スクリプトでの試みは機能しません。
describe('tester', function() {
it('log should be empty', function() {
var log = "<div id='log'>log</div>";
var result = $(log).tester();
expect(result).toBeEmpty();
}
});
上記のさまざまな順列を試しました-すべて失敗します:
"Expected '<div id="log">log</div>' to be empty"
この方法で書かれたプラグインをテストすることは可能ですか?
テストしやすくするために別の方法でコードを書いた方がよいでしょうか?