QUnit + coffeescript scope - PullRequest
       8

QUnit + coffeescript scope

6 голосов
/ 25 июня 2011

В Javascript загрязнение глобального пространства имен обычно считается плохой вещью.Вот почему Coffeescript упаковывает весь ваш Javascript в оболочку (function() {}).call(this);.

Однако я начал писать тесты QUnit для моего кода Coffeescript, и QUnit жалуется, что он не может найти мои функции.

1. Died on test #1: getGoodNamePart is not defined
getGoodNamePart is not defined at Object.<anonymous> (file:///Users/kevin/Documents/docs/code/chrome/tests.js:2:10) at Object.run 

Я бы хотел проверить переменные, не загрязняя глобальное пространство имен.Какой хороший способ сделать это?

Вот сгенерированный Javascript, который я хочу проверить:

(function() {
getGoodNamePart = function(str) {
    if (str.charAt(0) === '"') {
      str.replace(/" <[^>]+>$"/g, "");
      str.replace(/"/g, "");
      return str;
    } else if (str.charAt(0) === '<') {
      str.replace(/<|>/g, "");
      return str;
    } else {
      return str;
    }
  };
}).call(this);

и мой файл test.js:

test('getGoodNamePart()', function() {
  equals(getGoodNamePart("\"Kev Burke\" <kev@inburke.com>"), "Kev Burke", "\"name\" <email> works");
  equals(getGoodNamePart("", "", "empty string works"));
  equals(getGoodNamePart("kev@inburke.com", "kev@inburke.com", "raw email works"));
  return equals(getGoodNamePart("<kev@inburke.com>", "kev@inburke.com", "email inside carets -> carets get stripped"));
});

СпасибоКевин

Ответы [ 2 ]

6 голосов
/ 25 июня 2011

Итак, вы говорите, что хотите протестировать getGoodNamePart, не загрязняя глобальное пространство имен. Но CoffeeScript автоматически модулирует каждый файл (по уважительной причине - см. мой ответ здесь ), что означает, что единственный способ получить доступ к функциям в разных файлах - это прикрепить их к некоторому глобальному объекту. (Я предполагаю, что мы говорим здесь о браузере, а не о среде CommonJS, такой как Node.js, где вы бы использовали exports.)

Это дает вам три варианта:

  1. Присоедините getGoodNamePart к window. Это проще всего, поскольку единственное необходимое изменение - это префикс getGoodNamePart с window. (или просто @), но, конечно, это максимизирует загрязнение пространства имен.
  2. Присоедините getGoodNamePart к чему-то еще, что уже прикреплено к window или global.
  3. Переместите свои тесты в тот же файл, что и getGoodNamePart (необычная практика в мире JS, но стоит рассмотреть ее, поскольку она не затрагивает глобальное пространство имен и позволяет легко переходить между кодом и тестами).

Допустим, вы хотите перейти к # 2, экспортируя такие функции, как getGoodNamePart, исключительно для тестирования. Назовите их «тестовые цели». Вверху каждого файла с тестовой целью добавьте

window.testTargets ?= {}

и когда вы определите getGoodNamePart, напишите

testTargets.getGoodNamePart = getGoodNamePart = (str) ->
  ...

Затем в верхней части набора тестов QUnit напишите

{getGoodNamePart} = testTargets

чтобы получить функцию.

2 голосов
/ 17 июля 2011

Я скомпилирую кофейный файл с флагом --bare, для тестирования$ coffee -c -b your_fileэто не модулирует скомпилированный код

...