Тестирование приложения Emberjs с использованием QUnit и Karma завершается неудачно из-за `ReferenceError: Faye не определено`
Я тестировал приложение EmberJ с Qunit и кармой, и все работало хорошо. Затем мне пришлось интегрировать faye в приложение, которое прошло хорошо, но затем при запуске моего набора тестов он показывает следующие ошибки и сбои:
ReferenceError: Фэй не определена
Ошибка выдается где я определяю клиента в 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 ответ
Причина этого странного поведения связана со следующими строками в 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 будет установлен объект, если нет, будет установлен window.Faye.
Если вы используете отладчик и устанавливаете точку останова в этой строке, то вы действительно определите этот модуль, почему? это глобальный вспомогательный метод QUnit!
Почему Фэй делает это? Я думаю, потому что он может быть запущен в среде NodeJS (вы можете прочитать больше о module.exports здесь).
На мой взгляд, у вас есть 2 возможных решения:
- Требовать Фэй, прежде чем QUnit.
- Патч Фэй, чтобы игнорировать существование модуля в окне.
Я столкнулся с таким же поведением при использовании чайной ложки с QUnit.
Приготовление чайной ложки требует Фэй, прежде чем QUnit кажется плохой идеей и, вероятно, приведет к ужасному хаку.
Я закончил патчем для Фэй, чтобы он пропустил проверку модуля, тоже не очень красиво, но я считаю, что это разумно.