Модульное тестирование самовывозов

У меня есть функция, вызывающая себя в файле 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 внедряется в ваш рендерер, разделяя эту ответственность.

Другие вопросы по тегам