Настройка сборки CoffeeScript, которая поддерживает модульное тестирование?

Я хочу использовать CoffeeScript для создания того, что по сути будет библиотекой JavaScript.

Я просто хотел бы иметь возможность

  1. определить некоторые классы с наследованием
  2. сохранить мой код в нескольких файлах
  3. напишите несколько модульных тестов (QUnit или что-то еще, желательно написание тестов на CoffeeScript)
  4. (в идеале) следить за проектом и создавать его автоматически, пока я работаю

Это кажется разумным, нет? Мой план состоит в том, чтобы запускать модульные тесты для скомпилированного JavaScript в браузере, хотя, если я смогу запустить их прямо в node.js, это даже лучше.

В настоящее время я пытаюсь сделать это с помощью CoffeeToaster и QUnit, используя две разные конфигурации CoffeeToaster, одну с тестами и одну без них. Это работает, но, возможно, у кого-то есть лучшее предложение? Должен ли я отказаться от CoffeeToaster и использовать Cake? Или получить другую среду модульного тестирования? Может ли кто-нибудь указать мне учебник для этого? Я делаю клиентскую JS-библиотеку, поэтому не хочу задействовать Rails и т. д.


person PapaFreud    schedule 30.09.2012    source источник
comment
Спасибо за исправление заглавных букв, @PPvG, мне было лень. FWIW, мой двойной план конфигурации CoffeScript теперь работает, но мне все еще любопытно, есть ли у кого-нибудь другие (лучшие) предложения.   -  person PapaFreud    schedule 03.10.2012
comment
Рад слышать, что ваша установка работает, хотя вы все еще просите лучшего предложения. Можете ли вы уточнить? Чего тебе еще не хватает?   -  person Peter-Paul van Gemerden    schedule 14.10.2012
comment
Я надеялся управлять правильным порядком объединения файлов. Связанный вопрос SO: stackoverflow.com /questions/5758715/ - вот почему я смотрел на CoffeeToaster. Но, может быть, я просто использую ручной порядок в файле торта.   -  person PapaFreud    schedule 15.10.2012


Ответы (1)


В настоящее время я использую:

  • Mocha в качестве исполнителя тестов и should.js для утверждений;
  • Mockery для перехвата определенных require вызовов для изолированного тестирования с использованием макетов/заглушек необходимых библиотек;
  • *JSCoverage для инструментирования кода для отчетов о покрытии кода.

Мой код живет в src/, и я пишу свои тесты на CoffeeScript. Я использую make для создания и тестирования кода.

  • make build компилирует CoffeeScript в src/ в JavaScript в lib/.
  • make test создает код, а затем запускает тесты в test/.
  • make monitor наблюдает и запускает тесты, как только они изменяются. К сожалению, он не перекомпилирует код. Я использую привязку клавиш Vim для вызова make, что также запускает Mocha для повторного запуска тестов. Изменить: если вас это беспокоит, вы можете запустить coffee --watch -o lib/ -c src/.
  • make coverage создает отчет о покрытии кода и помещает его в lib-cov/report.html.

Мой Makefile выглядит примерно так:

COFFEE = ./node_modules/.bin/coffee --compile
MOCHA = NODE_ENV=test ./node_modules/.bin/mocha
MOCHA_OPTS = \
    --compilers coffee:coffee-script \
    --require should \
    --colors
REPORTER = spec

build:
    @$(COFFEE) --output lib/ src/

test: build
    @$(MOCHA) --reporter $(REPORTER) $(MOCHA_OPTS)

monitor:
    @$(MOCHA) --reporter min $(MOCHA_OPTS) \
    --watch --growl

coverage: instrument
    @MYLIB_COV=1 $(MOCHA) $(MOCHA_OPTS) \
    --reporter html-cov > lib-cov/report.html

instrument: build
    @rm -rf ./lib-cov
    @jscoverage ./lib ./lib-cov

.PHONY: build test monitor coverage instrument

Вероятно, вы могли бы использовать вышеизложенное с очень небольшой модификацией.

Чтобы сгенерировать отчет о покрытии с помощью make coverage, необходимо запустить тесты для инструментированного кода в lib-cov/ вместо кода в lib/. Чтобы это стало возможным, необходимы три вещи:

  1. Makefile следует установить переменную среды, например MYLIB_COV (измените имя по своему усмотрению).

  2. Ваш index.js должен посмотреть на эту переменную окружения и require либо lib/, либо lib-cov/ соответственно:

    // index.js
    module.exports = process.env.MYLIB_COV
      ? require('./lib-cov/mylib')
      : require('./lib/mylib');
    

    Если вам нужен экспорт из нескольких исходных файлов, вы можете объединить их здесь. Если у вас в package.json есть что-то отличное от index.js как 'main', не забудьте изменить его.

  3. Ваши тесты должны require '../':

    # test/test.user.coffee
    describe 'User', ->
      User = {}
    
      before ->
        {User} = require '../'
    
      describe '#equals()', ->
        describe 'when users have the same username and host', ->
          it 'should return true', ->
            user1 = new User 'user', 'some.host.foo'
            user2 = new User 'user', 'some.host.foo'
            user1.equals(user2).should.be.true
    
      # etc.
    

Я оставлю читателю в качестве упражнения выяснить, нужен ли им Mockery и как его использовать, если он нужен. Однако я укажу, что вызов require в тестовом фрагменте выше выполняется внутри before по определенной причине.

Удачного кодирования!

person Peter-Paul van Gemerden    schedule 01.10.2012