如何对此代码进行单元测试

时间:2012-04-09 02:37:31

标签: javascript unit-testing

我搜索了如何进行单元测试,但实例非常简单。示例总是显示返回某些内容的函数或者返回返回内容的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
})

1 个答案:

答案 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函数中完成的。