2011-11-18 91 views
2

我在JavaScript文件中有一个自调用函数。这样的事情:单元测试自调用函数

com.renderer = (function(){ 

    render(data){ 

    } 

    .....other functions 

    return{ 

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

     } 
    } 

})().init(); 

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

任何建议或替代?

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

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

回答

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数据的依赖注入您的渲染器,分离出的责任。

+0

datafetcher在哪里定义?我的这个设计的重点在于避免污染全局命名空间。谢谢。 – ChrisOdney

+0

你没有得到答案的原因是因为为了让某件东西成为可测试的东西,你必须能够掌握它 - 你的设计不提供任何处理。一旦你的代码运行,它的封闭完全封闭,你的测试代码没有任何工作要做。为了测试这个代码,你必须做这里提出的建议并创建一些参考。 –

相关问题