Модульное тестирование функций самовоспроизведения - PullRequest
2 голосов
/ 18 ноября 2011

У меня есть функция, вызывающая себя в файле JavaScript.Примерно так:

com.renderer = (function(){

    render(data){

    }

    .....other functions 

    return{

        init : function(){
            $(document).ready(function(){
              jsonData = fetchFromServer();
              render(jsonData);
            });

         }
    }

})().init();

Я думаю о том, как провести юнит-тестирование.Я использую JSUnitTestDriver.Если бы я мог как-то внедрить jsonData в функцию рендеринга извне, это было бы хорошо, но мне это кажется невозможным.

Какие-нибудь предложения или альтернативы?

Я действительно не хочу удалять самопризывающий характер функции.И действительно ли имеет смысл менять то, что я считаю хорошим дизайном, ради юнит-тестов?(В данном конкретном случае, не в общем случае.)

Примечание. Я не могу общаться с сервером во время выполнения тестов.

1 Ответ

1 голос
/ 18 ноября 2011

Проблема в том, что вы пытаетесь выполнить модульное тестирование синглтона, а синглтоны, как правило, не считаются хорошим дизайном.

Вместо этого я хотел бы рассмотреть что-то вроде следующего:

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 внедряется в средство визуализации, разделяя эту ответственность.

...