在测试中:确保所有的JS都加载了requirejs

在测试中:确保所有的JS都加载了requirejs,requirejs,requirejs-rails,Requirejs,Requirejs Rails,我对我们的功能规格有一些问题。我现在怀疑requirejs是作恶者。似乎我们的规范(Rails with capybara webkit)在加载所有JavaScript文件之前就开始运行了。Capybara webkit允许我评估webkit中的Javascript,我希望在开始测试运行之前使用它来确保一切就绪 我可以查询它加载的模块的requirejs吗?有什么活动我可以听吗?或者我可以在测试运行时注入一个requirejs模块来设置一个全局状态,我可以从我的测试中查询它(不是我的首选解决方案

我对我们的功能规格有一些问题。我现在怀疑requirejs是作恶者。似乎我们的规范(Rails with capybara webkit)在加载所有JavaScript文件之前就开始运行了。Capybara webkit允许我评估webkit中的Javascript,我希望在开始测试运行之前使用它来确保一切就绪

我可以查询它加载的模块的requirejs吗?有什么活动我可以听吗?或者我可以在测试运行时注入一个requirejs模块来设置一个全局状态,我可以从我的测试中查询它(不是我的首选解决方案)

我不是requirejs专家,也没有实现我们的很多JavaScript,但我需要修复它;)

我找到了答案:您可以使用
require.defined('modules/booking\u form/main')
询问该模块是否已加载。使用自定义的
等待_,直到
我可以延迟我的测试运行,直到一切就绪。

“加载”是一个有点模糊的词

如果这意味着对模块提出了请求。它是特定的。只要在任何地方需要模块,无论是作为模块定义的依赖项还是带有模块名称的require调用,following都会返回true

require.specified(moduleID);
require.defined(moduleID);
一旦模块被解析并加载到内存中,或者换句话说,一旦模块的源被提取并加载,并且模块的定义函数完成执行。下面返回true

require.specified(moduleID);
require.defined(moduleID);
您还可以在
requirejs.s.context.\uu.defined
中查找它。像这样检查lib的数据结构是一种有点黑客的方式,但在浏览器(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
**如果require用于全局范围内的其他用途,则可以使用requirejs代替require


**以上所有内容都假设您在测试的任何地方都有对require/requirejs[global]的引用。

这就是我想做的,但请等待,直到从capybara中取出