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

时间:2013-10-16 17:48:10

标签: requirejs requirejs-rails

我的功能规格有些问题。我目前怀疑requirejs是恶人。看起来我们的规范(带有capybara-webkit的Rails)在加载所有JavaScript文件之前就开始运行了。 Capybara-webkit允许我在Webkit中评估Javascript,我想用它来确保在开始测试运行之前一切都已就绪。

我可以以某种方式查询其加载的模块的requirejs吗?我能收听的活动吗?或者我可以在测试运行时注入一个requirejs模块来设置我可以从我的测试中查询的全局状态(不是我真正喜欢的解决方案)吗?

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

2 个答案:

答案 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,我可以延迟测试运行,直到所有内容都到位。