单元测试自动调用功能

时间:2011-11-18 02:30:57

标签: unit-testing javascript js-test-driver

我在JavaScript文件中有一个自调用函数。像这样:

com.renderer = (function(){

    render(data){

    }

    .....other functions 

    return{

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

         }
    }

})().init();

我正在考虑如何对此进行单元测试。我正在使用JSUnitTestDriver。如果我能以某种方式从外部向渲染函数注入jsonData,那就不错了,但这对我来说似乎是不可能的。

有任何建议或替代方案吗?

我真的不想删除该函数的自调用性质。为了单元测试,改变我认为好的设计真的有意义吗? (在这种特殊情况下,不是一般情况。)

注意:运行测试时我无法与服务器通信。

1 个答案:

答案 0 :(得分: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数据的依赖注入到渲染器中,从而将该责任分离出去。