・・・まではよかったのだが・・・
ここで課題が2つ.
1. テスト(特に通信系)どう書くの?
2. コーディング規約は?
とりあえず普通のテストはいいとして…通信…Mock?
とか調べてたら出てきたのが Sinon.js
ライブラリのように使え, いろいろと内蔵しているじゃじゃ馬
いろいろありすぎて手に負えませんorz
とりあえずjQuery.ajaxが使いたかったので, 有効そうな2つをピックアップ.
A. FakeServer
名前の通り偽者のサーバを立てる.
とか調べてたら出てきたのが Sinon.js
ライブラリのように使え, いろいろと内蔵しているじゃじゃ馬
いろいろありすぎて手に負えませんorz
とりあえずjQuery.ajaxが使いたかったので, 有効そうな2つをピックアップ.
A. FakeServer
名前の通り偽者のサーバを立てる.
var sinonTestCase = sinon.testCase({
setUp : function() {
this.server = sinon.fakeServer.create();
},
tearDown : function() {
this.server.restore();
},
"test server":function () {
this.server.respondWith("GET", "/some/article/comments.json",
[200, { "Content-Type": "application/json" },
'[{ "id": 12, "comment": "Hey there" }]']);
var callback = sinon.spy();
jQuery.getJSON("/some/article/comments.json", callback);
this.server.respond();
sinon.assert.calledWith(callback, [{ id: 12, comment: "Hey there" }]);
},
});
TestCase("Fakeserver test case", sinonTestCase);
これで "Fakeserver test case" という名前のテストクラスが出来上がる.
setUp でfakeServerを立ち上げ
tearDown でその偽サーバを破棄している.
偽者とはいえ通信系, 破棄しておかないと特に通しのテストの時に…
"test server" がテストクラス名. 名前は test から始めないとテストとして認識されないので注意.
sinon.fakeServer.responsedWith で偽サーバのresponseの内容を決める.
sinon.spyは仮のcallback関数. これをテストしたい関数に組み込むことで, 後々sinon.assertが使えたりする. 詳しくはAPIで
server.respond() を呼ぶことでfakeServerが応答し, 先に設定したresponseを返す.
これにより, callbackにfakeServerからの応答が入る.
あとはsinon.assertを用いてきちんと応答が受け取れたことを確認する.
…すっごい不安だ('A`)
B. Stub
あるクラスの ある関数を 一時的に置き換える
stubのよるテスト例
var sinonTestCase = sinon.testCase({
"test with stub" : function() {
var json = [{"hoge":"hoge","foo":"foo","bar":"bar"},
{"hoge2":"hoge2","foo2":"foo2","bar2":"bar2"},
{"hoge3":"hoge3","foo3":"foo3","bar3":"bar3"}];
var stub = sinon.stub(jQuery, "ajax");
stub.yieldsTo("success", json);
jQuery.ajax({
success: function (data) {
assertEquals(json, data);
}
});
stub.restore();
}
});
TestCase("Stub test case", sinonTestCase);
こちらは"Stub test case"クラス.
8行目にてstubを作成, 9行目にてjQuery.ajaxというメソッドの返り値を指定している.
11行目から実際にテストしたいメソッドを呼び, 値をチェックする.
こっちのほうが使いやすい気はした(・`ω・´) (キリッ
restore()は忘れずに.(setUp&tearDownに入れたほうがいい気がした(^ω^;).
参考:SinonAPI
明らかにAPIのが正しいのでそちらを参考に…
コーディング規約についてはまた後日…(・ω・)ノシ
0 件のコメント:
コメントを投稿