【发布时间】:2012-02-28 19:23:49
【问题描述】:
我很难理解如何设置一个允许我测试我的 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$;
【问题讨论】:
-
如果您也提供了测试代码,那将会很有用。 :)
-
好的,抱歉回复晚了,但我已被重新分配,因此优先级较低。我有一种复杂的方式来运行我在问题中编辑的测试。它写得不是很好,因为我不太明白 jQuery 是如何做到的。
-
您编写的测试并不能真正证明除了您的代码执行之外的任何东西。如果失败,它也会污染其他有问题的测试,因为如果失败,您将无法恢复 $。我认为您仍然错过了这些测试的重点:您应该为您期望从代码中获得的 行为 编写测试,而不是它如何执行的细节。您应该尝试编写一个测试,该测试只专注于在您的函数运行后证明该 gameList 具有 X 选项,其中包含任何值。
标签: javascript jquery unit-testing