Unit testing 单元测试自调用函数

Unit testing 单元测试自调用函数,unit-testing,javascript,js-test-driver,Unit Testing,Javascript,Js Test Driver,我在JavaScript文件中有一个自调用函数。大概是这样的: com.renderer = (function(){ render(data){ } .....other functions return{ init : function(){ $(document).ready(function(){ jsonData = fetchFromServer();

我在JavaScript文件中有一个自调用函数。大概是这样的:

com.renderer = (function(){

    render(data){

    }

    .....other functions 

    return{

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

         }
    }

})().init();
我正在考虑如何进行单元测试。我正在使用JSUnitTestDriver。如果我能以某种方式从外部将
jsonData
注入到渲染函数中,那会很好,但对我来说这似乎是不可能的

有什么建议或选择吗

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


注意:我不能在运行测试时与服务器交谈。

问题是您试图对单例进行单元测试,而单例通常被认为是不好的设计

但是,我会考虑如下的事情:

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.

这使用了一种称为依赖注入(dependency injection)的技术,将获取JSON数据的依赖注入到渲染器中,从而分离出这一责任。

在哪里定义了数据获取程序?我使用这种设计的全部目的是避免污染全局名称空间。谢谢。你没有得到答案的原因是,为了让某些东西可以测试,你必须能够得到一个句柄——你的设计没有提供句柄。一旦你的代码运行了,它就会被完全封闭起来,你的测试代码也就没有什么可做的了。为了测试这段代码,您必须执行此处建议的操作,并创建某种引用。