我很难理解如何设置一个对象,允许我测试我的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