如何对动态加载javascript文件的javascript代码进行单元测试?

如何对动态加载javascript文件的javascript代码进行单元测试?,javascript,jasmine,mocha.js,karma-runner,Javascript,Jasmine,Mocha.js,Karma Runner,假设file1.js有一个名为doSomething()的函数,可以动态加载file2.js file2.js设置全局变量window.file2\u LOADED==true 我如何编写下面这样的测试 describe("A Unit Test", function() { it("can I load scripts dynamically here?", function() { loadScript('base/file2.js'); waitForDynamical

假设file1.js有一个名为doSomething()的函数,可以动态加载file2.js

file2.js设置全局变量
window.file2\u LOADED==true

我如何编写下面这样的测试

describe("A Unit Test", function() {
  it("can I load scripts dynamically here?", function() {
    loadScript('base/file2.js');
    waitForDynamicallyLoadedScriptsToLoad_IWishThisFunctionExisted(function(){
        expect(window.FILE2_LOADED).equal(true);
    });
  });

});
更新: 我发现了一些我仍然不喜欢的解决方案(没有解决方案),但认为值得记录

在这个Github回购协议上(它使用摩卡咖啡,而不是茉莉花) ->

您可以使用
grunt test:unit运行它

相关代码位于dynamic_load_test.js

describe("Unit: dynamic loading scripts", function() {
  it("method 1 works, but using setTimeout and done is still ugly"+
    "also, it may interfere with other tests", function(done) {
    console.log('----------- method 1 -------------');
    window.ACOUNTER = undefined;
    loadScript('base/app/scripts/file2.js');
    setTimeout(function(){
        console.log('m1_2: '+window.ACOUNTER);
        expect(window.ACOUNTER).equal(1);
        done()
    }, 1000)
    console.log('m1_1: '+window.ACOUNTER);
  });

  it("method 2 works too, but I don't wanna have acces to the callback", function() {
    window.ACOUNTER = undefined;
    console.log('----------- method 2 -------------');
    loadScript('base/app/scripts/file2.js', function(){
        console.log('m2_2: '+window.ACOUNTER);
        expect(window.ACOUNTER).equal(1);
    });
    console.log('m2_1: '+window.ACOUNTER);
  });

  it("method 3, doesn't work", function() {
    window.ACOUNTER = undefined;
    console.log('----------- method 3 -------------');
    loadScript('base/app/scripts/file2.js');
    describe("wait for all async to finish", function(){
        it("now it will be loaded", function(){
            console.log('m3_2: '+window.ACOUNTER);
            expect(window.ACOUNTER).equal(1);
        })
    })
    console.log('m3_1: '+window.ACOUNTER);
  });

  it("method 4, use jquery. Callback is never invoked.", function() {
    window.ACOUNTER = undefined;
    console.log('----------- method 4 -------------');
    loadScript('base/app/scripts/file2.js');

    $(document).ajaxStop(function () {
        console.log('m4_2: '+window.ACOUNTER);
        expect(window.ACOUNTER).equal(1);
    });

    console.log('m4_1: '+window.ACOUNTER);
  });

});

Jasmine支持异步测试:


我还可以通过一个函数的参数设置要加载的文件的路径,这样您就可以加载一些简单的模拟文件,而不是一个完整的(假定需要一些其他依赖项)脚本。

我的第一直觉是,您不应该对这类事情进行单元测试。但我也很好奇怎么做。@Jonline:这有什么关系?@Robert Harvey叹息;不是。由于语言障碍,我将问题误解为异步验证文件是否已加载。只要假装我从未在这里,看看GitHub上的代码,您已经为loadScript定义了一个回调。这不正是
waitForDynamicallyLoadedScriptsToLoad\u iWish此函数存在的目的吗(暂时不考虑错误情况)?谢谢。这很有帮助,但仍然不是我所需要的