Подтвердить что ты не робот

Как я могу заставить 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?

4b9b3361

Ответ 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)