Модульное тестирование самовывозов
У меня есть функция, вызывающая себя в файле JavaScript. Что-то вроде этого:
com.renderer = (function(){
render(data){
}
.....other functions
return{
init : function(){
$(document).ready(function(){
jsonData = fetchFromServer();
render(jsonData);
});
}
}
})().init();
Я думаю о том, как провести юнит-тестирование. Я использую JSUnitTestDriver. Если бы я мог как-то ввести jsonData
для функции визуализации извне это было бы хорошо, но мне это кажется невозможным.
Есть предложения или альтернативы?
Я действительно не хочу удалять самопризывающий характер функции. И действительно ли имеет смысл менять то, что я считаю хорошим дизайном, ради юнит-тестов? (В данном конкретном случае, а не вообще.)
Примечание. Я не могу общаться с сервером во время выполнения тестов.
1 ответ
Проблема в том, что вы пытаетесь выполнить модульное тестирование синглтона, а синглтоны обычно не считаются хорошим дизайном.
Вместо этого я хотел бы рассмотреть что-то вроде следующего:
function createRenderer(dataFetcher) {
function render(data) {
}
// other functions
return {
init: function () {
$(document).ready(function () {
jsonData = dataFetcher();
render(jsonData);
});
}
};
}
// in your production code
com.renderer = createRenderer(fetchFromServer);
com.renderer.init();
// in your unit test
var renderer = createRenderer(function () {
return { test: "data" };
});
renderer.init();
// run your tests against renderer.
При этом используется метод, называемый внедрением зависимостей, при котором зависимость от выборки данных JSON внедряется в ваш рендерер, разделяя эту ответственность.