@isaacs жалуется, что тесты Mocha не поддерживают node
. Я думаю, что это глупая жалоба, но я думаю, что он представляет меньшинство, поэтому замолчать их, возможно, было бы полезно.
Вот что я предполагаю: вместо того, чтобы использовать, например, describe
, it
и т. Д. По умолчанию, вы бы сделали
var mochaBDD = require("mocha/bdd");
var describe = mochaBDD.describe;
var it = mochaBDD.it;
// ok, stupid boilerplate is over but at least I don't have to use a test runner, woohoo!
В качестве альтернативы это могло быть просто
require("mocha/bdd");
и это создаст для вас несколько глобалов.
Что вы думаете?
Даже если бы он просто вывалил свое дерьмо по всему миру, когда вы require('mocha')
, было бы лучше, чем текущее положение вещей.
Не думаю, что это глупо, но есть компромиссы со всем. Я был бы доволен примерно таким:
var Mocha = require('mocha');
var mocha = new Mocha(options);
mocha.describe('blah blah', function....
никто не стал бы его использовать, но, по крайней мере, это был бы более чистый способ реализовать то, что у нас есть сейчас. Там будет тонна шаблонов, которые каждый должен будет настраивать каждый раз, но если бы мы могли сузить их до API-интерфейсов CLI, это было бы нормально. Даже если был lib / cli.js, который только что прошел в ARGV, но я все еще сомневаюсь, что кто-то будет его использовать, вы можете использовать его без CLI достаточно легко, но это показывает, что никто действительно не хочет выходить за рамки некоторых крайних случаев.
@visionmedia , кажется, неплохо. Причина, по которой я предложил require("mocha/bdd")
или что-то подобное, заключается в том, что это было бы довольно легко реализовать с точки зрения существующего Mocha, но да, ваш, вероятно, лучше. (Вы можете представить себе его использование, например, для одновременного запуска нескольких наборов тестов или чего-то еще. Что ж, это, вероятно, сломается из-за использования process.on ('uncaughtException'), но вы понимаете, что я имею в виду.)
Я могу попробовать сделать это однажды.
Это отличный пример, когда небольшой будущий JavaScript через деструктурирующее присваивание имеет большое значение.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/New_in_JavaScript/1.7#Destructuring_assignment_% 28Merge_into_own_page.2Fsection% 29
var [describe,it,beforeEach,afterEach] = new require("mocha")(options);
Просто хотелось бы, чтобы для этого была поддержка гармонии узлов.
Это идея, чтобы уметь делать
node test/a-mocha-test.js
И он провел этот тест?
@glenjamin ага
Попытавшись сделать это сам на nodepec, проблема заключалась не в том, чтобы сделать доступными различные функции, проблема заключалась в том, чтобы выяснить, как и когда начать выполнение - нам все равно нужен двухпроходный подход определения / выполнения.
Я придумал следующие варианты:
1) пусть каждый пользователь добавляет что-то вроде mocha.exec () в конец каждого файла, который они могут захотеть запустить изолированно
2) Подождите, пока ядро добавит что-то вроде process.on ('exit'), но когда цикл событий все еще доступен
3) предположить, что каждый файл имеет только один блок описания верхнего уровня, и начать выполнение, когда это закончится
(1), вероятно, самый красивый, который может выглядеть так:
var run = require('mocha/required');
describe('blah blah' , function() {
// ..
});
run();
Похоже, что это не добавляет ничего особенного к выполнению node ./node_modules/.bin/_mocha test/a-mocha-test.js
когда вам действительно нужно работать без оболочки mocha
.
Я думаю, что это больше не соответствует тому, как в настоящее время используется мокко. Поскольку эта ветка неактивна больше года, я закрываю ее.
Если кому-то это все еще интересно, не стесняйтесь комментировать или предлагать пул-реквест, и мы рассмотрим :)
Можно ли открыть его снова? Я все еще очень заинтересован в этом. Невозможность всего лишь node test.js
тестов мокко была одной из основных причин, по которой я и мои коллеги из Mapbox перешли от мокко к ремням, таким как лента и тап. Лично я предпочел бы придерживаться мокко, но считаю этот аргумент "способности узла" несколько убедительным.
Изменить: аргумент «способность узла» был разработан @tmcw здесь .
Для ясности, отсутствие интерфейса require
able здесь не является основным препятствием с точки зрения пользователя. Следующее уже задокументировано для работы:
var describe = require('mocha').describe;
var before = require('mocha').before;
var it = require('mocha').it;
А с ES6 становится еще лучше:
import { describe, before, it } from 'mocha';
Проблема в том, что это работает только при запуске через двоичный файл mocha
.
О, спасибо за разъяснения. :) Если мы уже предлагаем эту возможность при запуске с использованием двоичного файла mocha, я согласен, было бы неплохо сделать то же самое с node. Посмотрим на это. Спасибо!
Теперь у этого узла есть перехватчик beforeExit, и это кажется вполне выполнимым.
Должно быть что-то вроде
var { describe, it } = require('mocha/auto')
Да уж. Как сказал TJ, проблема в том, что даже если мы сделаем все «доступным для узлов», для этого может потребоваться слишком много шаблонов, чтобы быть полезным.
Однако...
@glenjamin, спасибо за beforeExit
. Я думаю, мы могли бы это использовать. Люди, наверное, до сих пор жаловались бы, что это слишком "волшебство" ...
Я добавил доказательство концепции в 3cdd4a04c48193cceac6af7db72af06d380014a9
в любом случае, это потребует некоторой работы, но я думаю, что мы можем легко обобщить это для всех интерфейсов. здесь нет поддержки Growl, mocha.opts
или других вещей, связанных с process
таких как коды выхода. Мы должны извлечь код из bin/_mocha
и использовать его здесь. Тогда у нас также может быть аргументированная поддержка. Например:
$ node test/my-test.js --reporter=dot
Если у кого-то есть предложения, дайте мне знать
Я думаю, что извлечение некоторых вещей из bin/_mocha
в какой-то CLI было бы довольно разумным независимо от этого.
Я все еще не уверен, что это действительно полезное дополнение?
Есть ли большая практическая разница между одним из следующих?
node test/test.js
./node_modules/.bin/mocha test/test.js
PATH=./node_modules/.bin:$PATH mocha test/test.js
npm test -- test/test.js
У меня такое ощущение, что люди, которые не используют мокко, потому что они не могут запускать тестовые файлы через node
, просто люди, которые не любят мокко и ищут оправдание! Мокко не обязательно должно быть для всех: smile:
@glenjamin, это просто должно произойти. У Mocha должен быть основной программный API. Хорошим побочным эффектом этого являются тесты с поддержкой узлов. Среда, в которой он работает, будет использовать программный API, будь то браузер, интерфейс командной строки или что-то еще. Mocha.app, кто-нибудь? :)
Интересует эта функция!
+1 за:
import { describe, before, it } from 'mocha';
В настоящее время у нас есть const {describe, it} = require('mocha')
, но в этом нет необходимости, потому что глобальные переменные уже существуют.
Если нас интересует поддержка браузера, мы всегда можем сделать const {describe, it} = window.mocha
. Мы уже должны сделать это для chai .
ну, я полагаю, const {describe, it} = window
тоже.
это настолько важно для архитектуры mocha, что mocha экспортирует глобальный объект, когда он связан.
Я не думаю, что mocha должен определять какой-либо глобальный объект, кроме единого пространства имен, и, возможно, только для браузеров.
исполняемый файл mocha
продолжит использовать глобальные переменные; это, вероятно, никогда не изменится.
то, к чему мы можем (и должны) стремиться, - это возможность легко запускать тесты мокко через node
не загрязняя глобальное пространство имен. вот о чем этот выпуск.
к сожалению, это клубок шпагата размером с Техас, ни у кого не было времени или энергии, чтобы распутать его, что должно быть очевидно по возрасту проблемы ...
исполняемый файл
mocha
продолжит использовать глобальные переменные; это, вероятно, никогда не изменится.
Хотя я ничего не знаю о том, как устроен мокко, я могу утверждать, что именно этот единственный выбор дизайна является источником проблемы.
скорее всего так!
Я на самом деле еще раз взглянул на код, выяснил (более или менее), что я сделал не так в прошлый раз, когда пытался взломать глобальные объекты, подумал о том, что нужно, чтобы тестовые файлы запускались с node test/someFile.js
, и полагаю, что знаю, как сделать и то, и другое - с оговоркой, что выполнение этого без утроения числа крайних случаев, вероятно, потребует нарушения некоторых существующих крайних случаев. Более подробно мои мысли по поводу дизайна:
require("mocha").it
et al. (Примечание: причина, по которой это не нарушается при выборе других интерфейсов, может заключаться в том, что в Mocha есть ошибка, при которой в большинстве случаев он настраивает интерфейс BDD, даже если выбран другой. # 2207) Я хочу отойти от этого.global
).Mocha
(что экспортирует require("mocha")
).Mocha
, выбран другой интерфейс.require("mocha/tddInterface").test
или require("mocha/interface/bdd").it
(не путать с "mocha/lib/interfaces/<interface name>"
где реализации живут).node test/someFile.js
вместо mocha test/someFile.js
var Mocha = require("mocha"); var mocha = new Mocha()
и т. Д. (То есть «программный интерфейс»). Нам нужно было бы либо обнаружить это и не запускать Mocha «способ с поддержкой узлов», либо (проще для нас, но требует согласия пользователей) потребовать, чтобы возможность доступа к узлам была доступна через другой импорт, например require("mocha/nodeable").it
( .describe
и т. Д.). Специальный импорт вместо совмещения с require("mocha")
было бы проще реализовать безопасно и соответствовал бы моему желанию (описанному и оправданному в разделе, посвященном предотвращению глобальных переменных) отказаться от экспорта интерфейсов в объекте Mocha
экспортировано require("mocha")
.node test/someFile.js
, недостаточно того, чтобы someFile.js
мог импортировать интерфейс Mocha: Mocha должен быть создан, и после того, как все тесты настроены, Mocha должен запуститься. Другими словами, require("mocha/nodeable")
должен создать экземпляр Mocha, а также экспортировать интерфейс, а затем ... после запуска тестового файла он должен запустить Mocha.process.on("beforeExit"
, при условии, что тестовый файл не запускает никаких асинхронных действий.process.nextTick
или setImmediate
или setTimeout(..., 0 /* or some small number */)
.--delay
и асинхронно запускаются с помощью run()
, будут проблемой. Не для того, чтобы знать, когда бежать - это проще, есть run()
- и даже не для того, чтобы знать, нужно ли --delay
(см. Ниже или предоставить require("mocha/nodeable/delayed")
), а потому, что run()
Предполагается, что run()
в любом случае должен вызываться в каждом тестовом файле, и в этом случае использовать его с тестами с поддержкой узлов будет легко после исправить это. В противном случае ... Я не знаю, что мне делать.mocha
вместо node
(т.е. использование этого не приводит к принудительному использованию node
), тогда все, что есть require
d должен определять, когда используется CLI, и не создавать Mocha. Это было бы проще, чем обнаруживать, когда используется программный API - интерфейс командной строки может установить какое-то глобальное состояние, которое эти модули будут проверять, или эти модули могут проверить, является ли CLI файлом, который запускал Node.mocha.opts
, или что-нибудь, что позволяло бы тестовым файлам с поддержкой узлов использовать поведение, отличное от стандартного для Mocha. поведение.global
для размещения их функций, он передает им «выбранный объект интерфейса». (ИЗМЕНЕНО, ЧТОБЫ ДОБАВИТЬ: это должно быть сделано как в lib/mocha.js
и в browser-entry.js
. Насколько мне известно, все части предложения, относящиеся к глобальному, выполняются как в Node, так и в браузере. )global
.localInterface
( --local-interface
в интерфейсе командной строки) остановит Mocha от копирования из выбранного интерфейсного объекта в global
.require("mocha").it
Mocha также скопирует функции TDD / BDD из выбранного интерфейсного объекта в Mocha
, но позже это будет объявлено устаревшим / удалено.require("mocha/interface")
экспортирует выбранный интерфейсный объект.require("mocha/interface/<specific interface>")
вызовет указанный интерфейс с новым выбранным объектом интерфейса, который он впоследствии будет экспортировать.require("mocha/interface")
также будет свойством объекта mocha
в браузере, mocha.interface
, для поддержки использования браузера без модульной системы.require("mocha/nodeable/<specific interface>")
создаст экземпляр Mocha, настроит Mocha для запуска после тестового файла (предположительно с использованием setTimeout
если не используется delay
, см. Выше re. delay
) и экспортировать выбранный объект интерфейса для этого интерфейса так же, как require("mocha/interface/<specific interface>")
mocha.opts
поддерживаются, require("mocha/nodeable")
создаст экземпляр Mocha, настроит Mocha для запуска после тестового файла (см. Выше) и выполнит те же действия по настройке интерфейса, что и CLI, экспортируя выбранный интерфейсный объект точно так же, как require("mocha/interface")
.mocha
тогда mocha/nodeable
& mocha/nodeable/<specific interface>
не требуется, мы можем использовать возможности узла для mocha/interface
& mocha/interface/<specific interface>
.Мысли?
На самом деле, после дальнейшего размышления, я предлагаю закрыть этот билет по следующему обоснованию против использования node <test file>
вместо mocha <test file>
:
mocha.opts
. Простое решение: положить шарики в test
сценария в package.json
вместо: npm test
будет работать все из них и mocha
( node_modules/.bin/mocha
, npx mocha
) запустит только указанные тестовые файлы. (Файлы или глобусы, которые должны запускаться для любого тестового запуска, независимо от того, сколько тестовых файлов запущено, все равно должны входить в mocha.opts
.)mocha.opts
. Теперь это должно быть достигнуто с помощью mocha --opts /dev/null
(или в Windows mocha --opts nul
). Если по какой-то причине это не так, было бы проще реализовать флаг CLI, чтобы пропустить обработку mocha.opts
."mocha/nodeable"
просто поместите тот же код с использованием программного API Mocha в гипотетический пакет "nodeable-mocha"
.Если мы обнаружим какое-либо существенное преимущество, которого легче достичь в основном, чем за его пределами, мы всегда можем открыть его заново.
Тем не менее, я также предлагаю повторно открыть заявку на избегание глобальных переменных, потому что:
describe
, it
и т. Д.?), Они возможны в принципе (ответ на этот вопрос мог бы быть более точным. чем 0, хотя и немного) - теоретически то, что нужно делать, не выгружать содержимое в глобальное пространство имен.поэтому вы предполагаете, что Mocha предоставляет способ запускать тесты с mocha
но с флагом, который не загрязняет global
?
Часть того, что делает мокко-мокко, и часть его успеха заключается в том, что он не требует шаблонов для импорта. Несмотря на догму о загрязнении глобального пространства имен, есть вполне веские причины для этого с точки зрения эргономики разработчика.
так вы предполагаете, что Mocha предоставляет способ запускать тесты с мокко, но с флагом, который не загрязняет глобальную среду?
Ага.
Часть того, что делает мокко-мокко, и часть его успеха заключается в том, что он не требует шаблонов для импорта. Несмотря на догму о загрязнении глобального пространства имен, есть вполне веские причины для этого с точки зрения эргономики разработчика.
Я не говорю, что в целом не согласен, но в качестве дополнительной функции я вижу, где некоторые разработчики могут захотеть импортировать вместо глобальных (возможно, они хотят, чтобы их модуль называл локальную переменную context
не ссылаясь случайно к глобальному, если они забудут var
, возможно, они захотят использовать сторонний интерфейс, где такое столкновение еще более вероятно), и теперь, когда я понял, как это сделать правильно, также легче сделать в Mocha, чем как какое-то дополнение (на самом деле, если меня не увлечет что-то еще, я, вероятно, на этой неделе добавлю черновик в ветке, чтобы продемонстрировать).
(Кроме того, мы уже поддерживаем своего рода попытку, когда после настройки интерфейса на глобальном уровне он копируется в объект Mocha
так что вы можете require("mocha").it
, но версия, которую мы уже откровенно говоря, поддержка - это странно, непоследовательно , подвержено ошибкам и даже фактически не позволяет избежать загрязнения глобального пространства имен. Если мы вообще собираемся сохранить такую функцию, мы можем исправить ее, а не поддерживать сомнительную версию.)
Это ИМО в отличие от возможности node <test file>
для тестов Mocha, которые, насколько мне известно, не имеют никаких преимуществ и их было бы одинаково сложно реализовать как внутри, так и за пределами Mocha.
@stevenvachon
почему у меня const {describe, it} = require('mocha')
не работает? Я только что получил неопределенное ...
$ node -v
v8.4.0
@zapphyre, вам по-прежнему нужно запускать набор тестов через программу mocha
, а не через node
.
Вы не можете запускать несколько исходных файлов с помощью node
, поэтому вы застряли с mocha
. Я не знаю тестового раннера / фреймворка, у которого нет собственного исполняемого файла.
Обновлен заголовок проблемы, чтобы быть более конкретным
Другая причина для этого: я хотел бы запускать тесты, используя другую среду выполнения JS, например low.js (потому что это одна из наших платформ, другие - node.js, браузер и React Native). Я могу сделать это, когда у меня есть JS-файл, который импортирует мокко и запускает тесты, я не могу этого сделать, когда мне нужно вызвать mocha
для запуска тестов.
Я имею в виду, вы уже делаете это для браузера. На этой платформе у меня есть JS-код, который импортирует «мокко», а затем запускает тесты из глобального объекта mocha
используя mocha.run()
.
В браузере я
mocha
mocha.setup({ui: 'bdd'});
mocha.checkLeaks();
mocha.globals([]);
mocha.run();
Вот и все. Когда я пробую то же самое в node.js, используя оператор require вместо SystemJS для загрузки тестового файла, я получаю (используя mocha 5.2.0)
> mocha.run();
TypeError: Cannot read property 'search' of undefined
at Mocha.mocha.run (/home/mha/one/node_modules/mocha/mocha.js:149:54)
РЕДАКТИРОВАТЬ: я пробовал https://github.com/mochajs/mocha/wiki/Using-Mocha-programmatically и mocha.addFile
вместо того, чтобы просто загружать его, результат тот же.
Есть ли в настоящее время способ импортировать описание / это?
Существует новая (на данный момент 20-часовая) страница Wiki https://github.com/mochajs/mocha/wiki/Using-mocha-programmatically, но она предназначена для запуска тестов.
Другая причина для этого: я хотел бы запускать тесты, используя другую среду выполнения JS, например low.js (потому что это одна из наших платформ, другие - node.js, браузер и React Native). Я могу сделать это, когда у меня есть JS-файл, который импортирует мокко и запускает тесты, я не могу этого сделать, когда мне нужно вызвать
mocha
для запуска тестов.
Если альтернативная среда выполнения имеет исполняемый файл, похожий на узел (что, я думаю, есть в low.js?), Тогда вы можете сделать alternative-executable ./node_modules/.bin/_mocha
, и это должно сработать.
Я не знаю тестового раннера / фреймворка, у которого нет собственного исполняемого файла.
https://github.com/tapjs/node-tap/#tutti -i-gusti-sono-gusti
Теперь, когда https://github.com/mochajs/mocha/issues/3006 разрешен, было бы неплохо иметь в браузере экспорт с тем же именем.
В настоящее время работает:
<script type="module">
import './node_modules/mocha/mocha.js'
console.log(mocha)
</script>
Но этого нет:
<script type="module">
import { mocha } from './node_modules/mocha/mocha.js'
console.log(mocha)
</script>
(по запросу https://github.com/mochajs/mocha/issues/956#issuecomment-167453800)
Это может стать проще, если мы объединим нашу ветку со сворачиванием и настроим транспилеры. Кажется возможным иметь пакет esm и унаследованный пакет, который использует пути кода esm и добавляет глобальные утечки. Нам пришлось бы проявить большую осторожность, чтобы вносить изменения только в недавно добавленные пути и пакеты кода, чтобы мы не ломали или кодировали как в браузерах, так и в узле
С глобальными переменными и типами это просто делает мокко унаследованным.
Кстати, только что создал @types/mocha
без глобальных переменных: https://github.com/whitecolor/mocha-types
Надеюсь, они (глобалы) скоро будут официально удалены.
Самый полезный комментарий
+1 за:
import { describe, before, it } from 'mocha';