5

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

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

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

4

2 回答 2

4

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

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

require.specified(moduleID);

一旦模块被解析并加载到内存中,或者换句话说,一旦模块的源被获取并加载并且模块的定义函数完成执行。以下返回真。

require.defined(moduleID);

您也可以在requirejs.s.contexts._.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

** 可以使用 requirejs 代替 require,以防在全局范围内将 require 用于其他目的。

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

于 2013-12-28T15:11:49.717 回答
1

我在这里找到了答案:您可以用 询问require.defined('modules/booking_form/main')该模块是否已加载。通过自定义wait_until,我可以延迟我的测试运行,直到一切就绪。

于 2013-10-17T08:08:37.557 回答