如何对动态加载javascript文件的javascript代码进行单元测试?
假设file1.js有一个名为doSomething()的函数,可以动态加载file2.js file2.js设置全局变量如何对动态加载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
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此函数存在的目的吗(暂时不考虑错误情况)?谢谢。这很有帮助,但仍然不是我所需要的