Как выставить объекты javascript для модульного тестирования, не загрязняя глобальное пространство имен - PullRequest
7 голосов
/ 20 декабря 2011

У меня есть плагин автозаполнения javascript, который использует следующие классы (написанные на coffeescript): Query, Suggestion, SuggestionCollection и Autocomplete.Каждый из этих классов имеет связанную спецификацию, написанную на жасмине.

Плагин определен в модуле, например:

(function(){
  // plugin...
}).call(this);

Это предотвращает загрязнение классов глобальным пространством имен, но также скрывает их от любых тестов (спецификаций с жасмином или юнит-тесты с чем-то вроде q-unit).

Каков наилучший способ предоставления классов или объектов javascript для тестирования без загрязнения глобального пространства имен?

Я отвечу предложенным решениемс, но я надеюсь, что есть что-то более стандартное.

Обновление: мои попытки решения

Поскольку я новичок с <100 xp, я могуне отвечу на мой вопрос в течение 8 часов.Вместо того, чтобы ждать, я просто добавлю то, что я здесь сделал. </p>

Чтобы определить эти классы, я изобрел глобальный объект с именем _test, в котором я выставил все классы для тестирования.Например, в coffeescript:

class Query
  // ...

class Suggestion
  // ...

// Use the classes

// Expose the classes for testing
window._test = {
  Query: Query
  Suggestion: Suggestion
}

Внутри моих спецификаций я могу раскрыть класс, который тестирую:

Query = window._test.Query

describe 'Query', ->
  // ...

Преимущество этого в том, что только _testобъект загрязнен, и вряд ли он столкнется с другим определением этого объекта.Это все еще не так чисто, как мне бы этого хотелось.Я надеюсь, что кто-то предоставит лучшее решение.

1 Ответ

3 голосов
/ 20 декабря 2011

Я думаю, что-то вроде модульной системы CommonJS (используемой, например, brunch ) будет работать.

Вы можете разделить ваш код на модули, и части, которые нуждаются в них, импортируют их через require. Единственная часть, которая «загрязняется» - это карта модуля, поддерживаемая кодом управления модулем, очень похожая на ваш test объект.

В Autocomplete.coffee

class exports.Query
// ...

class exports.Suggestion
// ...

, а затем в Autocomplete.spec.coffee

{Query, Suggestion} = require 'app/models/Autocomplete'

describe 'Query', ->
...