Javascript 浏览器测试设置:如何使全局SystemJS模块可用于要求(';SystemJS';)的测试代码?
我的代码相当独立于系统,在node.js或浏览器上运行的代码很少依赖于系统。我已经设法设置了基于mocha的测试,这样它就可以在这两种环境中工作,使用相同的测试和相同的代码模块。我还管理了浏览器测试环境,以自动交换对那些很少依赖于系统的包的调用,这些包总是调用node.js版本作为浏览器版本 所以一切都在运行,包括摩卡和西农以及所有的测试 直到我决定使用SystemJS不仅用于运行测试,还用于代码本身 js部分仍然可以工作,包括测试。当我运行浏览器测试时,问题出现了 对于那些我使用运行测试的index.html文件的人,下面是完整的 请注意,这与任何以后的产品浏览器环境无关,在这个早期阶段,我只想测试我已经针对浏览器的代码(完全基于网络和存储,没有任何GUI内容,在浏览器上使用IndexedDB,在node.js和browser上使用WebSocket) 关键是这条线——这是唯一一条新的线,其他一切都已经运行了好几个月Javascript 浏览器测试设置:如何使全局SystemJS模块可用于要求(';SystemJS';)的测试代码?,javascript,systemjs,Javascript,Systemjs,我的代码相当独立于系统,在node.js或浏览器上运行的代码很少依赖于系统。我已经设法设置了基于mocha的测试,这样它就可以在这两种环境中工作,使用相同的测试和相同的代码模块。我还管理了浏览器测试环境,以自动交换对那些很少依赖于系统的包的调用,这些包总是调用node.js版本作为浏览器版本 所以一切都在运行,包括摩卡和西农以及所有的测试 直到我决定使用SystemJS不仅用于运行测试,还用于代码本身 js部分仍然可以工作,包括测试。当我运行浏览器测试时,问题出现了 对于那些我使用运行测试的in
SystemJS.set('systemjs', SystemJS.newModule(SystemJS));
对于sinon
来说,类似的方法已经运行了好几个月,我希望在模块使用require('SystemJS')
时,我可以使用完全相同的方法使已经可用的SystemJS
可用。但它不起作用
这是模块在其要求后看到的内容:
需要
“>
实际的SystemJS模块内容位于Symbol():tt
下面
我相信答案非常简单,但是SystemJS的文档对我没有帮助,这当然可能完全是我自己的错,但事实就是如此,我不得不在两个小时后询问,没有结果。我也花了一段时间来进行当前的设置,包括阅读SystemJS源代码,我明白了这一切都是我自己说的,但我认为这个微小而非常具体的问题可能有理由提出这样一个问题
为了完成对设置的描述(对于那些好奇的人):我从WebStorm运行它,目录设置是一个普通的node.js项目,带有/test/
,/src/
,/lib/
,当然还有/node\u modules/
。html文件是/test/index.html
,我告诉WebStorm“运行”“它是,因此WS充当测试的Web服务器
浏览器测试
#错误预处理{
宽度:50em;
边缘:2米4米;
填充:1em;
边框:1px纯红;
}
/*全球系统*/
摩卡咖啡设置(“bdd”);
//此黑客切换依赖于系统的组件,以便
//具有node.js特定代码的模块的语句将交换为它们的
//浏览器版本。
const resolvorig=SystemJS.constructor.prototype.resolve;
SystemJS.constructor.prototype.resolve=函数(键,父项){
返回resolvorig.call(SystemJS,key.replace('-nodejs.js','-browser.js'),parents);
};
// ======================================================
//相关部分(我尝试的内容)
//这项工作:
SystemJS.set('sinon',SystemJS.newModule(sinon));
//这不起作用:
SystemJS.set('SystemJS',SystemJS.newModule(SystemJS));
// ======================================================
//这些是我想在浏览器中运行的./test/中的测试脚本
常量mochaTestScripts=[
//…简表。。。。
“加密助手”,
“地图查询”,
“对象帮助程序”,
“存储”
];
SystemJS.config({
地图:{
“chai”:“../node_modules/chai/chai.js”,
“chai as promised”:“../node_modules/chai as promised/lib/chai as promised.js”,
//蔡依从承诺
“检查错误”:“../node_modules/check error/check error.js”,
“js-sha256”:“../node_modules/js-sha256/build/sha256.min.js”
}
});
我保证(
mochaTestScripts.map(testScript=>
SystemJS.import('./'+testScript+'-test.js')
.catch(错误=>{
const div=document.getElementById('errors');
const pre=document.createElement('pre');
pre.appendChild(document.createTextNode('Test:'+testScript+'\n\n'+err));
儿童分部(学前);
})
)
)
.然后(()=>{
摩卡。检查泄漏();
摩卡环球([]);
mocha.run();
})
.catch(错误=>{
const div=document.getElementById('errors');
const pre=document.createElement('pre');
pre.appendChild(document.createTextNode('GLOBAL ERROR\n'+err));
儿童分部(学前);
});
我自己解决了:
我必须去SystemJS的源代码中找到答案。问题似乎在于SystemJS
符号不像通常那样只是一个普通的对象,其中方法是直接位于该对象内部的属性。相反,SystemJS
是一个实例,方法在原型上
最终起作用的是SystemJS如何在内部使用newModule
,最终起作用的命令是
SystemJS.registry.set(
'systemjs',
SystemJS.newModule({default: SystemJS, __useDefault: true})
);
这将替换上面index.html
testrunner文件中//这不起作用:
下的行