Как я могу заставить Mocha загрузить файл helper.js, который определяет глобальные перехватчики или утилиты?
У меня есть файл с именем test/helper.js
, который я использую для запуска тестов Mocha в моих приложениях Node.js. Моя структура тестов выглядит так:
test/
test/helper.js # global before/after
test/api/sometest.spec.js
test/models/somemodel.spec.js
... more here
Файл helper.js
должен быть загружен, потому что он содержит глобальные перехватчики для моего набора тестов. Когда я запускаю Mocha для выполнения всего набора тестов следующим образом:
mocha --recursive test/
Файл helper.js
загружается перед моими испытаниями, и мой крюк before
выполняется, как ожидалось.
Однако, когда я запускаю только один конкретный тест, helper.js
не загружается перед тестом. Вот как я его запускаю:
mocha test/api/sometest.spec.js
Глобальный before
не вызван, даже не < <29 > .
Итак, как я могу заставить Mocha всегда загружать мой файл helper.js
?
Ответы
Ответ 1
В Mocha нет понятия специального файла с именем helper.js
, который он загружал бы перед другими файлами.
То, что вы пытаетесь выполнить, работает при запуске mocha --recursive
из-за порядка загрузки файлов Mocha. Поскольку helper.js
на один уровень выше, чем другие файлы, он загружается первым. Когда вы указываете отдельный файл в Mocha, Mocha просто загружает этот файл и, как вы обнаружили, ваш файл helper.js
вообще не загружается.
Итак, вы хотите загрузить файл таким образом, чтобы он установил верхние уровни ( "глобальные" ) крючки (например, before
, after
и т.д.). Опции:
-
Вы можете использовать Mocha программно и подавать файлы в том порядке, в котором вы хотите.
-
Вы можете заставить себя всегда указывать свой вспомогательный файл в командной строке, прежде чем перечислить любой другой файл. (Я бы этого не сделал, но это возможно.)
-
Еще один вариант - организовать ваш пакет, как я описал в этом ответе. В принципе, у вас есть один файл верхнего уровня, который загружает остальную часть пакета в него. С помощью этого метода вы потеряете возможность запуска Mocha для отдельных файлов, но вы можете использовать --grep
для выбора того, что выполняется.
Вы не можете использовать параметр -r
. Он загружает модуль перед запуском пакета, но, к сожалению, загруженный модуль не имеет доступа к любому интерфейсу тестирования, который Mocha предоставляет вашим тестам, поэтому он не может устанавливать привязки.
Ответ 2
Я создаю файл test/test_helper.js
, который экспортирует все создаваемые помощники:
// test/test_helper.js
module.exports = {
MyHelper: require('./helpers/MyHelper')
}
Тогда я require
помощник на любом тесте, который мне нужно использовать:
// test/spec/MySpec.js
var helper = require('../test_helper');
// Or if you need just "MyHelper"
var myHelper = require('../test_helper').MyHelper;
describe('MySpec', function () {
// Tests here...
});
Я предпочитаю этот подход, потому что его легко понять и гибко. Вы можете увидеть это в действии в моей демонстрации: https://github.com/paulredmond/karma-browserify-demo/tree/master/test
Ответ 3
Во-первых, я бы определенно использовал mocha.opts
, чтобы вам не приходилось включать параметры, которые вы хотите каждый раз. Как уже отмечалось, один из вариантов заключается в использовании --grep
, но я не являюсь большим поклонником этого лично. Это потребовало, чтобы вы назвали все чрезмерно упрощенным способом. Если крюк before
НЕ является асинхронным, вы можете использовать --require
в своем mocha.opts
. например.
#mocha.opts
--recursive
--require test/helpers.js
Похоже, это не сработает для вас, потому что вы хотите глобальный after
hook. То, что я сделал, это просто вызов полного набора тестов каждый раз, но если я нахожусь в середине разработки и хочу только протестировать один набор или даже один конкретный тест, я использую функцию эксклюзивности, only
https://mochajs.org/#exclusive-tests. Вы можете сделать это it.only('...
или describe.only('...
. Если вы это сделаете, он просмотрит все тесты и настроится так же, как и ваш полный тестовый жгут, но затем выполнит только те тесты или набор, которые вы указали.
Теперь вы можете включить эти глобальные перехватчики без проблем. @Louis упоминает, что ваш helpers.js
загружается в правильном порядке только по совпадению. Это неправда. Если вы помещаете какие-либо крючки за пределы блока describe
, он автоматически становится глобальным. Это может быть достигнуто путем помещения его в собственный файл
// helpers.js
before(function() { console.log('testing...'); });
или в тестовом файле
// some.spec.js
before(function() { console.log('testing...'); });
describe('Something', function() {
it('will be tested', function() {
...
});
});
Очевидно, я считаю, что положить его в свой собственный файл чище. (Я назвал его hooks.js
). Точка, это не результат порядка загрузки файлов.
Только один полученный, который может быть очевиден для другого, но я изо всех сил старался - крючки, не помещенные в блок describe
, являются глобальными. Они не относятся к каталогу. Поэтому, если вы скопируете helpers.js
в поддиректорию тестов, крючки before
и after
теперь будут запускаться дважды. Кроме того, если вы поместите туда beforeEach
hook, он будет запускаться перед каждым тестом, а не только те тесты в этом каталоге.
В любом случае, я знаю, что этот пост немного устарел, но, надеюсь, это поможет другим, имеющим похожие проблемы.
Ответ 4
Я пришел к этому вопросу после того, как попробовал всевозможные вещи, чтобы мои тесты подключались один раз к базе данных, а затем запускал кучу тестов crud
на моем models
.
Затем я нашел mocha-prepare, который решил мои проблемы.
В вашем файле helper.js
вы можете просто определить функцию prepare
.
prepare(done => {
console.log('do something asynchronously here')
done()
}, done => {
console.log('asynchronously clean up after here')
done()
})
работает с удовольствием.
Ответ 5
В нашем проекте мы используем помощники примерно так:
clientHelper = require("../../../utils/clientHelper")
Вам нужно правильно настроить относительный путь вашего помощника.
И затем называя это следующим образом:
clientHelper.setCompanyId(clientId)