2014-12-02 5 views
1

Я тестировал приложение EmberJs с Qunit и кармическим бегуном, и он работал хорошо. Тогда мне пришлось интегрировать Фея в приложение, которое шло хорошо, но затем работаю мой тестовый набор, он показывает следующее сообщение об ошибке и аварии:Тестирование приложения Emberjs с использованием QUnit и Karma не удается из-за `ReferenceError: Faye не определено`

ReferenceError: Faye is not defined

ошибка брошена, где я определяю клиент в emberjs

client = new Faye.Client(uri); 

Хотя это работает в разработке, постановке, но не в тестировании. Overhere, uri = "http://localhost:9292/faye"

faye.js входит в vendor.js (одиночный JS файлов, которые имеют все JS плагинов включая ember.js и уголек-data.js себя), который загружается перед тем app.js (файл, где выше линия существует)

ответ

1

причина этого странного поведения связано со следующими линиями в Фей:

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 будет установлен объект, если нет, window.Faye будет установлен.
Если вы используете отладчик и устанавливаете точку останова на этой линии, вы получите этот , почему? это глобальный вспомогательный метод QUnit!
Почему Фэй делает это? Я думаю, потому что его можно запустить в среде NodeJS (вы можете узнать больше о module.exports here).
Как я вижу у вас есть 2 возможных решения:

  • Требовать Фей перед тем QUnit.
  • Patch Faye игнорировать наличие модуля в окне.

Я столкнулся с таким же поведением при использовании Teaspoon с QUnit.
Создание чайной ложки требует Faye до того, как QUnit кажется плохой идеей и, вероятно, будет в уродливом взломе.
Я закончил с исправлением Faye, чтобы он пропустил проверку модуля, не так красиво, но я считаю, что это разумно.