我正在测试EmberJs与Qunit和Karma跑步者的应用程序,它运作良好。 然后我不得不将faye集成到运行良好的应用程序中,然后运行我的测试套件,它显示以下错误和崩溃:
ReferenceError:未定义Faye
错误被扔到哪里,我在emberjs中定义客户端
client = new Faye.Client(uri);
虽然这适用于开发,暂存但不是测试。
覆盖,uri = "http://localhost:9292/faye"
faye.js包含在vendor.js(单个js文件中,其中包含所有js插件,包括ember.js和ember-data.js本身),它们在app.js(上面一行存在的文件)之前加载
答案 0 :(得分:1)
这种奇怪行为的原因与Faye中的以下几行有关:
if (typeof module !== 'undefined')
module.exports = Faye;
else if (typeof window !== 'undefined')
window.Faye = Faye;
来源:https://github.com/faye/faye/blob/master/javascript/faye.js#L143
因此,如果 module 未定义(意味着已定义),那么 module.exports 将被设置为对象,如果没有, window.Faye 将是集。
如果您使用调试器并在该行上设置断点,那么该模块实际定义,为什么?它是一种QUnit全球助手方法!
为什么Faye这样做?我想因为它可以在NodeJS环境中运行(你可以阅读更多关于module.exports here的信息)。
在我看来,你有两种可能的解决方案:
将Teaspoon与QUnit一起使用时,我遇到了同样的行为 在QUnit之前让Teaspoon需要Faye看起来像个坏主意并且可能是丑陋的黑客 我最终修补了Faye让它跳过模块检查,也不是那么漂亮,但我相信这是合理的。