[salesforce][CI] Sinon.JS(Stub、fakeServer)

By |9月 7, 2012|CI, Javascript, salesforce, |


前回に引き続きCI関連からSinon.JSで特に重宝している「Stub」と「fakeServer」を紹介します。
 
■公式
■Stub
■fakeServer
 
Stubの概要として既存のメソッドを一時的に書き換えることができます。
例えばテストコードからのテストの際、「confirm」の分岐や「setTimeout」の呼び出しに悩まされるかと思います。

[php]
function confirmWrapper(){
if(confirm(‘実行します。よろしいですか?’)){
//はいの処理
}else{
//いいえの処理
}
}
[/php]

このような場合、下記のような形で書き換えることができます。

[php]
var stub = sinon.stub(window, "confirm");
var func = func(){return false;};
stub.returns(func());
//上記で作成した関数を実行するといいえの処理が動く
confirmWrapper();
//元に戻す
stub.restore();
[/php]

JQueryでも、第1引数(windowの部分)に$や$.uiをセットし、第2引数にメソッド名をセットする事で適用可能です。
 
fakeServerはAjax処理の際、実際の通信を行わずダミーのレスポンスを戻すことができます。

[php]
function ajaxWrapper(){
$.ajax({
type: "GET",
url: "/apex/DummyFront",
data: {request:"dummyId"},
dataType:’json’,
success: function(json) {
if(json.result){
//結果がTrue
}else{
//結果がFalse
}
},
error:function(XMLHttpRequest, textStatus, errorThrown){
//エラー
}
});
}
[/php]

これを、下記で書き換えます。

[php]
//fakeserverオブジェクト作成
var sserver = sinon.fakeServer.create();
//GETメソッドで"/apex/DummyFront"に対するAJax通信が行われた場合
//'{"result": false}’をレスポンスで戻す
sserver.respondWith("GET",
"/apex/DummyFront",
[200,{"Content-Type": "application/json" },'{"result": false}’]
);
//ajax処理(上記で作成した関数)を呼び出す
ajaxWrapper();
//このタイミングでレスポンスが戻る
//※resultにfalseをセットしたので「//結果がFalse」の処理に入ります
sserver.respond();
//元に戻す
sserver.restore();
[/php]

これで実際に通信する事なくAjaxのテストを行うことができます。レスポンスも簡単に変えることができるのでテストが非常に楽になります。またテストだけでなくサーバ、クライアントを分けて開発する際にも有用です。
 
上記で紹介した2つのAPI以外にも、メソッドが呼び出された際の情報を取得できる「spy」や期待値を元に確認できる「mock」など、テストに有用なAPIが用意されております。興味がある方は一度使ってみてください。
 
あ、利用する際には読み込みもお忘れなく

[php]
<apex:includeScript value="{!URLFOR($Resource.sf, ‘sinon-1.4.2.js’)}" />
[/php]