使用QUnit和Karma测试Emberjs应用程序失败,原因是“ReferenceError:Faye未定义”

时间:2014-12-02 07:01:48

标签: ember.js scope qunit faye karma-qunit

我正在测试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(上面一行存在的文件)之前加载

1 个答案:

答案 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的信息)。
在我看来,你有两种可能的解决方案:

  • 在QUnit之前要求Faye。
  • Patch Faye忽略窗口中模块的存在。

Teaspoon与QUnit一起使用时,我遇到了同样的行为 在QUnit之前让Teaspoon需要Faye看起来像个坏主意并且可能是丑陋的黑客 我最终修补了Faye让它跳过模块检查,也不是那么漂亮,但我相信这是合理的。