3

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

com.renderer = (function(){

    render(data){

    }

    .....other functions 

    return{

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

         }
    }

})().init();

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

有什么建议或替代方案吗?

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

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

4

1 回答 1

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 数据的依赖被注入到您的渲染器中,从而分离了该责任。

于 2011-11-18T04:31:47.557 回答