Тестирование приложения 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 кажется плохой идеей и, вероятно, приведет к ужасному хаку.
Я закончил патчем для Фэй, чтобы он пропустил проверку модуля, тоже не очень красиво, но я считаю, что это разумно.

Другие вопросы по тегам