1

我正在使用 Qunit 和 karma runner 测试 EmberJs 应用程序,它运行良好。然后我不得不将 faye 集成到运行良好的应用程序中,但是在运行我的测试套件时,它显示以下错误和崩溃:

ReferenceError: Faye 未定义

错误抛出的地方,我在 emberjs 中定义客户端

client = new Faye.Client(uri);

尽管这在开发,分期但在测试中有效。这边,uri = "http://localhost:9292/faye"

faye.js 包含在在 app.js 之前加载的 vendor.js(包含 ember.js 和 ember-data.js 本身在内的所有 js 插件的单个 js 文件)中(存在上述行的文件)

4

1 回答 1

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.exports将被设置为对象,如果不是,则为窗口.Faye将被设置。
如果您使用调试器并在该行上设置断点,您将实际定义该模块,为什么?它是一个 QUnit 全局辅助方法!
费伊为什么这样做?我猜是因为它可以在 NodeJS 环境中运行(您可以在此处阅读有关 module.exports 的更多信息)。
如我所见,您有两种可能的解决方案:

  • 在 QUnit 之前需要 Faye。
  • 修补 Faye 以忽略窗口中模块的存在。

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

于 2015-01-07T23:27:53.117 回答