我的功能规格有些问题。我目前怀疑requirejs是恶人。看起来我们的规范(带有capybara-webkit的Rails)在加载所有JavaScript文件之前就开始运行了。 Capybara-webkit允许我在Webkit中评估Javascript,我想用它来确保在开始测试运行之前一切都已就绪。
我可以以某种方式查询其加载的模块的requirejs吗?我能收听的活动吗?或者我可以在测试运行时注入一个requirejs模块来设置我可以从我的测试中查询的全局状态(不是我真正喜欢的解决方案)吗?
我不是requirejs专家,并没有实现我们的JavaScript,但我需要修复它;)
答案 0 :(得分:4)
“已加载”是一个含糊不清的词。
如果这意味着对模块提出了请求。它指定的。只要模块定义的依赖项或模块名称的require调用,只要模块在任何地方都需要,则返回true。
require.specified(moduleID);
一旦模块被解析并加载到内存中,或者换句话说,一旦获取并加载模块的源并且模块的定义功能完成执行。以下返回true。
require.defined(moduleID);
您也可以在requirejs.s.contexts._.defined
中查找。这是检查像这样的lib的数据结构的一种hackish方式,但是在浏览器(firebug)中工作,以防你想要保证模块是否加载。我用firebug和requirejs 2.1.4进行了测试。
console.log(window.requirejs.s.contexts._.defined['SOME_MODULE']);
此方法还有助于使用firebug检查模块的内部内容(对象/原型的属性)。
如果要求是在进一步执行代码之前确保加载关键模块。带有成功回调的require调用。
require([moduleID], function(moduleExport){
//The module is loaded, proceed to the next step
//This is also an inherent load check
}, function (error) {
//The module cant be loaded, handle the exception case
});
以下代码段显示上面的每一个
console.log(require.specified('TEST_MODULE')); //false if the module isn't required yet
require(['TEST_MODULE'], function(TEST_MODULE){
console.log(require.defined('TEST_MODULE')); //true
console.log(require.s.contexts._.defined['TEST_MODULE'] ? true : false); //true
}, function (error) {
console.log('TEST_MODULE cant be loaded');
});
console.log(require.defined('TEST_MODULE')); //false if the module isn't ready yet
console.log(require.specified('TEST_MODULE')); //true
** requirejs可用于代替require,以防在全局范围内将require用于某些其他目的。
**以上所有假设您在任何地方都可以参考require / requirejs [global]。
答案 1 :(得分:1)
我找到了答案here:您可以询问require.defined('modules/booking_form/main')
是否加载了该模块。使用自定义wait_until
,我可以延迟测试运行,直到所有内容都到位。