单元测试自调用函数

Unit testing self-invoking functions

本文关键字:函数 调用 单元测试      更新时间:2023-09-26

我在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.

这使用了一种称为依赖注入的技术,其中对获取JSON数据的依赖被注入到您的渲染器中,分离出该责任。