我搜索了如何进行单元测试,但实例非常简单。示例总是显示返回某些内容的函数或者返回返回内容的ajax - 但我从未见过执行回调,嵌套回调和“单向”函数的示例,它们只是存储内容并且从不返回任何内容。
说我有这样的代码,我该如何测试呢?
(function(){
var cache = {};
function dependencyLoader(dependencies,callback2){
//loads a script to the page, and notes it in the cache
if(allLoaded){
callback2()
}
}
function moduleLoader(dependencies, callback1){
dependencyLoader(dependencies,function(){
//do some setup
callback1()
});
}
window.framework = {
moduleLoader : moduleLoader
}
}());
framework.moduleLoader(['foo','bar','baz'],function(){
//call when all is loaded
})
答案 0 :(得分:2)
这说明了在javascript中保持匿名函数私有的问题。验证事情是否在内部工作有点困难。
如果首先进行测试,那么缓存,dependencyLoader和moduleLoader应该在框架对象上公开可用。否则很难验证缓存是否得到了正确处理。
为了让事情顺利进行,我建议你在BDD上采取一种方法,这可以方便地为您提供一种方法来帮助您开始使用given-when-then
惯例拼出行为。我喜欢使用Jasmine,这是一个javascript BDD框架(与jstestdriver
集成),对于这种事情,我为上面的示例进行的单元测试将是:< / p>
describe('given the moduleloader is clear', function() {
beforeEach(function() {
// clear cache
// remove script tag
});
describe('when one dependency is loaded', function() {
beforeEach(function() {
// load a dependency
});
it('then should be in cache', function() {
// check the cache
});
it('then should be in a script tag', function() {
// check the script tag
});
describe('when the same dependency is loaded', function() {
beforeEach(function () {
// attempt to load the same dependency again
});
it('then should only occur once in cache', function() {
// validate it only occurs once in the cache
});
it('then should only occur once in script tag', function() {
// validate it only occurs once in the script tag
});
});
});
// I let the exercise of writing tests for loading multiple modules to the OP
});
希望这些测试是自我解释的。我倾向于重写测试,以便它们很好地嵌套,通常实际调用是在beforeEach
函数中完成的,而验证是在it
函数中完成的。