2

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

1 回答 1

2

这说明了在 javascript 的匿名函数中保持私有的问题。验证事情是否在内部工作有点困难。

如果这是先进行测试,那么缓存、dependencyLoader 和 moduleLoader 应该在框架对象上公开可用。否则很难验证缓存是否被正确处理。

为了让事情顺利进行,我建议您看一下BDD,它可以方便地为您提供一种方法来帮助您开始,让您通过given-when-then约定来说明行为。我喜欢使用Jasmine,它是一个 javascript BDD 框架(jstestdriver

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

于 2012-04-09T02:48:48.937 回答