Лучший способ динамически изменять оператор require для покрытия кода на тестах?

У меня есть библиотека node.js, которую я установил для BDD с помощью mocha и chai. Я также добавил покрытие кода с помощью istanbul. И все выполняется через задачи grunt.

Некоторое время я боролся, и, наконец, он заработал после того, как основал свою настройку на этом репозитории: https://github.com/morkai/h5.buffers. Работает, но реализация мне не нравится.

Плагин grunt-istanbul инструментирует файлы, устанавливается переменная среды, и тесты используют переменную среды для поиска местоположения инструментальных тестов. Мне не нравится эта последняя часть.

//Gruntfile.js
// ...
env: {
  "default": {
    LIB_FOR_TESTS_DIR: srcLibForTestsDir
  },
  coverage: {
    LIB_FOR_TESTS_DIR: lcovLibForTestsDir
  }
}
// ...

Затем в тестовом файле код:

var FooClient = require((process.env.LIB_FOR_TESTS_DIR || '../lib') + '/foo-client.js');

Я также использую помощник в тесте для любой инициализации, необходимой перед запуском тестового файла. Итак, у меня было две мысли;

  1. Используйте помощник по тестированию для извлечения файлов и скрытия там деталей:

    var foo = require('./test-helper.js').foo;
    var FooClient = foo.FooClient;
    var ThatOtherThing = foo.ThatOtherThing;
    
  2. Использовать тестовый раннер? Я видел ссылки на это, но я не нашел много информации об этом и передовых методах.

Есть ли способ лучше?

P.S. Если у кого-то есть предложение по поводу лучшего названия для этого вопроса, я открыт для идей.

P.P.S. Пожалуйста, не говорите мне переходить на одеяло в своем ответе. Я оценил оба и остановился на istanbul, потому что он дает больше информации о покрытии кода (например, о ветвлении). Если ветка одеяла в Стамбуле когда-нибудь будет завершена, я подумаю о переходе.


person Dave Jensen    schedule 27.11.2013    source источник


Ответы (1)


По сути, я сделал то, что вы указали выше, но выделил это в отдельную функцию, чтобы мои требования в моих тестах были немного чище / читабельнее.

module.exports = function(path){
  return require((process.env.LIB_FOR_TESTS_DIR || '../lib/') + path)
}

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

var appRequire = require('./require_helper'),
    model      = appRequire('models/model')

Мне было бы любопытно посмотреть, что придумали другие.

person Jonathan    schedule 28.11.2013
comment
Мне нравится это решение. Я собираюсь немного подождать, чтобы посмотреть, появятся ли другие ответы. - person Dave Jensen; 29.11.2013