我很難理解如何設置一個對象,允許我測試我的jQuery調用。我不需要嘲笑任何異步調用或任何東西,只是基本的使用。因此,讓我闡述了自己的功能,我想測試一下(截斷爲簡單起見):嘲笑jQuery來測試基本的使用
listGamesCallback : function(data) {
var gameList = $("#gameList select");
gameList.empty();
$.each(data, function() {
var newOption = $('<option>', {value : this.gameId });
newOption.text(string);
newOption.data("isJoinable", isJoinable);
// Add it to the list
gameList.append(newOption);
});
}
我需要在這裏嘲笑了jQuery單元測試這種方法,但我無法弄清楚如何做到這一點在JavaScript中。即使沒有jsMockito,我也不知道如何使用jQuery在這種情況下的屬性創建一個對象。任何幫助,這將不勝感激。
我正在使用jsTestDriver,jsHamcrest,jsMockito和jQuery。然而,創建具有這些屬性的$對象的一般化方法也是非常棒的。謝謝!
對於那些問,這是我想出了,似乎有點工作..但我不明白爲什麼。
var saved$ = $;
var mockContruct = mockFunction();
var mockedGamelist = mock(jQuery);
var mockedOption = mock(jQuery);
mocked$ = (function() {
var test = function(name) {
var args = jQuery.makeArray(arguments);
return mockContruct.call(test, args);
};
$.extend(test, $);
// This is what confuses me. This worked, but it's wierd
// It allows me to use the regular jQuery functions like
// $.each, while returning mocked objects when selectors are used.
test.prototype.constructor = test;
return test;
})();
$ = mocked$;
when(mockContruct).call(anything(), hasItem(containsString("#gameList")))
.thenReturn(mockedGamelist);
when(mockContruct).call(anything(), hasItems(containsString("<option>"), both(object()).and(hasMember("value"))))
.thenReturn(mockedOption);
headerFunctions.listGamesCallback([ {
gameId : 1,
isWhitesTurn : false,
isGameOver : false,
whiteUserName : "foobar",
blackUserName : "barfoo"
} ]);
JsMockito.verify(mockedGamelist).empty();
JsMockito.verify(mockedGamelist).append(mockedOption);
$ = saved$;
如果你提供了你的測試代碼,這也會很有用。 :) – alpian 2012-02-29 12:50:37
好的,對於遲到的回覆抱歉,但我已被重新分配,所以這得到了較低的優先級。我有一種錯綜複雜的方式來運行我編入問題的測試。它寫得不好,因爲我不太瞭解jQuery如何做它的功能。 – CrazyBS 2012-03-10 04:03:55
您編寫的測試並不能真正證明您的代碼執行以外的其他任何內容。如果失敗,它也會污染其他有問題的測試,因爲如果失敗則不會恢復$。我認爲你仍然錯過了這些測試的重點:你應該爲你的代碼期望的**行爲編寫一個測試,而不是它如何執行的細節。您應該嘗試編寫一個測試,該測試僅着重於在您的函數運行後證明gameList具有X選項以及其中的任何值。 – alpian 2012-03-11 22:40:49