Почему не & ldquo; mocha -r ts-node / register app / ** / *. Spec.ts & rdquo; (двойная звездочка) выполнить тесты в каталоге app /? [Дубликат]

JavaScript-решение без использования каких-либо внешних библиотек:

var now = new Date()
months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
var formattedDate = now.getDate()+"-"+months[now.getMonth()]+"-"+now.getFullYear()
alert(formattedDate)
13
задан manojlds 14 August 2015 в 21:57
поделиться

3 ответа

Решение

Измените свои сценарии так, чтобы то, что вы передали в Mocha, было защищено от расширения оболочкой:

"scripts": {
    "test": "mocha 'dist/**/*Test.js'",
 }

Обратите внимание на одинарные кавычки вокруг параметра, указанного в mocha.

Объяснение

Эта проблема исправлена ​​без использования внешних инструментов. Основной причиной вашей проблемы является то, что в npm используется sh как оболочка, которая будет запускать ваши команды сценария.

В подавляющем большинстве случаев, когда процесс * nix запускает оболочку, он запустит sh, если только что-то не говорит об этом иначе. Предпочтение оболочки, которое вы устанавливаете для входа в систему, не является способом «сказать об этом иначе». Поэтому, если у вас есть, скажем, zsh в качестве вашей оболочки входа, это не означает, что npm будет использовать zsh.

Те реализации sh, которые не содержат никаких расширений, кроме того, что sh должен предоставить, не понимайте ** glob так, как вы этого хотите. Насколько я могу судить, это интерпретируется как *. Тем не менее, Mocha интерпретирует пути, переданные ему, используя реализацию JavaScript globs. Таким образом, вы можете обойти проблему, защищая ваши глобы от интерпретации sh. Рассмотрим следующий package.json:

{
  "name": "immutable-ts",
  "scripts": {
    "bad": "mocha test/**/*a.js",
    "good": "mocha 'test/**/*a.js'",
    "shell": "echo $0"
  }
}

Скрипт shell - это просто, чтобы мы могли проверить, в какой оболочке работает скрипт. Если вы запустите его, вы увидите sh.

Теперь, учитывая следующее дерево:

test/
├── a.js
├── b.js
├── x
│   ├── a
│   │   ├── a.js
│   │   └── b.js
│   ├── a.js
│   └── b
│       └── a.js
└── y
    ├── a.js
    └── q

При всех файлах a.js и b.js, содержащих it(__filename); , Вы получаете следующие результаты:

$ npm run bad

> immutable-ts@ bad /tmp/t2
> mocha test/**/*a.js

  - /tmp/t2/test/x/a.js
  - /tmp/t2/test/y/a.js

  0 passing (6ms)
  2 pending

$ npm run good

> immutable-ts@ good /tmp/t2
> mocha 'test/**/*a.js'

  - /tmp/t2/test/a.js
  - /tmp/t2/test/x/a.js
  - /tmp/t2/test/x/a/a.js
  - /tmp/t2/test/x/b/a.js
  - /tmp/t2/test/y/a.js

  0 passing (5ms)
  5 pending
26
ответ дан Louis 27 August 2018 в 13:02
поделиться

Расширение glob действительно выполняется вашей оболочкой, и именно поэтому оно работает из командной строки.

Вы можете сделать mocha --recursive и указать в тестовый каталог.

-1
ответ дан manojlds 27 August 2018 в 13:02
поделиться

Вы можете встроить команду find с параметром -name в своих сценариях, чтобы заменить расширенный синтаксис globbing, предоставленный zsh.

В вашем случае команда будет:

mocha `find dist -type f -name '*Test.js'`

Вы можете реально опустить часть -type f, если уверены, что никогда не станете «Test.js» в имени каталога. (Безопасное предположение, скорее всего, но я включил его для полноты)

2
ответ дан Retsam 27 August 2018 в 13:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: