Bardzo trudno mi zrozumieć, jak skonfigurować obiekt, który pozwala mi przetestować moje wywołania jQuery. Nie muszę wyśmiewać żadnych połączeń asynchronicznych ani niczego, tylko podstawowe użycie. Więc pozwól mi ustawić mój funkcji, które chcę przetestować (obcięty dla uproszczenia):Kpiny z jQuery do testowania podstawowego użycia
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);
});
}
muszę kpić jQuery tutaj do testów jednostkowych tej metody, ale jestem w stanie dowiedzieć się, jak to zrobić w javascript. Nawet bez jsMockito nie wiem, jak utworzyć obiekt z właściwościami, które jQuery ma w tej sytuacji. Przydałaby się jakakolwiek pomoc.
Używam jsTestDriver, jsHamcrest, jsMockito i jQuery. Jednak ogólne podejście do tworzenia obiektu $, który ma te właściwości, byłoby również niesamowite. Dziękuję Ci!
Dla tych, którzy o to pytali, oto, co wymyśliłem, co wydawało się być dobrą pracą ... ale nie rozumiem dlaczego.
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$;
Przydałoby się, jeśli podałeś również swój kod testowy. :) – alpian
Ok, przepraszam za spóźnioną odpowiedź, ale zostałem ponownie przypisany, więc otrzymałem niższy priorytet. Mam skomplikowany sposób na przeprowadzenie testu, który zredagowałem na pytanie. Nie jest napisany bardzo dobrze, ponieważ nie bardzo rozumiem, w jaki sposób jQuery robi to, co robi. – CrazyBS
Test, który napisałeś, tak naprawdę nie dowodzi niczego innego niż twój kod. Może także zanieczyścić inne testy problemami, jeśli się nie powiedzie, ponieważ nie przywróci $, jeśli się nie powiedzie. Myślę, że nadal brakuje ci punktów tych testów: powinieneś napisać test na ** zachowanie **, którego oczekujesz od swojego kodu, a nie szczegóły tego, jak to działa. Powinieneś spróbować napisać test, który po prostu skupi się na udowodnieniu, że gameList ma opcje X z dowolnymi wartościami w nich po uruchomieniu funkcji. – alpian