Unit testing 单元测试自调用函数
我在JavaScript文件中有一个自调用函数。大概是这样的: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();
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数据的依赖注入到渲染器中,从而分离出这一责任。在哪里定义了数据获取程序?我使用这种设计的全部目的是避免污染全局名称空间。谢谢。你没有得到答案的原因是,为了让某些东西可以测试,你必须能够得到一个句柄——你的设计没有提供句柄。一旦你的代码运行了,它就会被完全封闭起来,你的测试代码也就没有什么可做的了。为了测试这段代码,您必须执行此处建议的操作,并创建某种引用。