Como especificar o diretório de teste do mocha?


219

O Mocha tenta encontrar os arquivos de teste testpor padrão, como faço para especificar outro diretório, por exemplo server-test?


Embora não seja 100% uma resposta à sua pergunta, confira jaketrent.com/post/run-single-mocha-test - eu vim aqui procurando como executar um conjunto de testes específico e isso mostra que você pode usar .onlye .skipgerenciar quais testes você Estão correndo. Importante durante o desenvolvimento de um recurso específico, quando você não deseja esperar que todo o conjunto de testes seja executado o tempo todo.
18760 Dave

Respostas:


141

Editar: esta opção está obsoleta: https://mochajs.org/#mochaopts


Se você deseja fazê-lo ainda executando apenas mochana linha de comando, mas deseja executar os testes em uma pasta em ./server-testsvez de ./test, crie um arquivo ./test/mocha.optscom exatamente isso no arquivo:

server-tests

Se você deseja executar tudo nessa pasta e subdiretórios, coloque-o em test/mocha.opts

server-tests
--recursive

mocha.opts são os argumentos transmitidos por meio da linha de comando; portanto, tornar a primeira linha apenas o diretório em que você deseja alterar os testes também redirecionará ./test/


12
Esta é a opção com o menor atrito, e deve ser o IMHO resposta aceita
Nick Tomlin

Estou usando uma das placas da caldeira e, na linha seguinte, pode ser por causa das janelas, você pode verificar uma vez.node ./node_modules/mocha/bin/mocha $ (encontre api -name '* -test.js') --compilers js: babel-core / registar
kobe

1
uma jóia, também funciona muito bem com as configurações mocha depuração WebStorm IDE, basta selecionar "padrões de arquivos" e deixar a entrada vazia, e ele usará mocha.opts
danday74

3
Essa é com certeza a melhor resposta. Provavelmente, vale a pena adicionar na sua resposta também que o mocha.optsarquivo pode ser colocado onde você quiser e, em seguida, basta executar mochaespecificando o caminho para o arquivo de configuração, por exemplo:mocha --opts ./mocha.opts
quirimmo

1
Você também pode apenas colocar --recursive na linha de comando mocha, útil se você definir o script de teste em sua package.json
unludo

282

Usa isto:

mocha server-test

Ou se você tiver subdiretórios, use isto:

mocha "server-test/**/*.js"

Observe o uso de aspas duplas. Se você os omitir, talvez não seja possível executar testes em subdiretórios.


1
Isso não funciona para mim. Se eu quiser fazê-lo desta forma eu tenho que fazermocha test/server-test
jonnie

22
A questão de aspas duplas me deixou por muito tempo! Obrigado por salvar minha sanidade. Grite para todos que estão lendo isso para prestar um cuidado extra a essas aspas duplas.
Ctrlplusb

11
No meu caso, eu estava usando mocha ./**/*.test.js(para que eu possa colocar o arquivo de teste no arquivo do módulo). O padrão parou de funcionar para mim quando adicionei um arquivo de teste em um nível diferente na hierarquia de arquivos que o resto dos testes, e só encontraria esse arquivo de bola ímpar e não as dezenas de outros que viviam no mesmo nível na hierarquia . O embrulho entre aspas o corrigia.
Stoutie

1
ou simplesmente use --recursivecomo explique abaixo
Jeff Dickey 29/03

4
Esta deve ser a resposta! As aspas duplas me salvam
Minh Thai

81

Aqui está uma maneira, se você tiver subpastas na sua pasta de teste, por exemplo

/test
/test/server-test
/test/other-test

Então, no linux, você pode usar o comando find para listar todos os arquivos * .js recursivamente e passá-lo para o mocha:

mocha $(find test -name '*.js')

29
ou simplesmente use --recursivecomo explique abaixo
Jeff Dickey 29/03

5
Então, em outras palavras mocha, não tem opção para definir a estrutura de diretório desejada na configuração?
Verde

usuário do cliente $ mocha $ (encontre testes -name '* .js') -bash: mocha: comando não encontrado; Obtendo este erro.
Lft93ryt

1
Isso é muito complicado e enganoso. Prefira as opções de mocha em vez de usar um comando do SO.
Michael Bushe

O envio da mensagem não responder à pergunta
ekkis

30

A boa maneira de fazer isso é adicionar um script npm "test" no package.json que chama mocha com os argumentos corretos. Dessa forma, o seu package.json também descreve sua estrutura de teste. Ele também evita todos esses problemas de plataforma cruzada nas outras respostas (aspas duplas vs simples, "localização" etc.)

Para que o mocha execute todos os arquivos js no diretório "test":

"scripts": {
    "start": "node ./bin/www", -- not required for tests, just here for context
    "test": "mocha test/**/*.js"
  },

Em seguida, para executar apenas os testes de fumaça, chame:

npm test

Você pode padronizar a execução de todos os testes em todos os projetos dessa maneira; assim, quando um novo desenvolvedor iniciar seu projeto ou outro, eles saberão que "npm test" executará os testes. Existe uma boa precedência histórica para isso (Maven, por exemplo, a maioria das escolas antigas também "faz" projetos). Com certeza ajuda o CI quando todos os projetos têm o mesmo comando de teste.

Da mesma forma, você pode ter um subconjunto de testes mais rápidos de "fumaça" que deseja que o mocha execute:

"scripts": {
    "test": "mocha test/**/*.js"
    "smoketest": "mocha smoketest/**/*.js"
  },

Em seguida, para executar apenas os testes de fumaça, chame:

npm smoketest

Outro padrão comum é colocar seus testes no mesmo diretório da origem que eles testam, mas chame os arquivos de teste * .spec.js. Por exemplo: src / foo / foo.js é testado por src / foo / foo.spec.js.

Para executar todos os testes denominados * .spec.js por convenção:

  "scripts": {
    "test": "mocha **/*.spec.js"
  },

Em seguida, para executar todos os testes, chame:

npm test

Veja o padrão aqui? Boa. :) A consistência derrota o mura .


Esta é a maneira mais precisa de fazer isso, eu acho.
ArturS 12/12

29

Não use a opção -g ou --grep, esse padrão opera com o nome do teste dentro dele (), não no sistema de arquivos. A documentação atual é enganosa e / ou totalmente errada sobre isso. Para limitar o comando inteiro a uma parte do sistema de arquivos, você pode passar um padrão como o último argumento (não é um sinalizador).

Por exemplo, este comando definirá seu repórter como spec, mas testará apenas os arquivos js imediatamente dentro do diretório server-test:

mocha --reporter spec server-test/*.js

Este comando fará o mesmo que acima, além de executar apenas os casos de teste em que a cadeia de caracteres it () / definição de um teste começa com "Fnord:":

mocha --reporter spec --grep "Fnord:" server-test/*.js

22

Se no node.js , algumas novas configurações a partir do Mocha v6 :

Opção 1: Criar .mocharc.jsonno diretório raiz do projeto:

{
  "spec": "path/to/test/files"
}

Opção 2: adicione mochapropriedade nos projetos package.json:

{
  ...

  "mocha": {
    "spec": "path/to/test/files"
  }
}

Mais opções estão aqui .


20

Execute todos os arquivos test_directoryincluindo os subdiretórios correspondentestest.js

find ./parent_test_directory -name '*test.js' | xargs mocha -R spec

ou use o --recursiveinterruptor

mocha --recursive test_directory/

11

Eu tive esse problema agora e o resolvi removendo a --recursiveopção (que eu havia definido) e usando a mesma estrutura sugerida acima:

mochify "test/unit/**/*.js"

Isso executou todos os testes em todos os diretórios sob /test/unit/mim e ignorou os outros diretórios dentro de mim./test/



3

Estou no Windows 7 usando node.js v0.10.0 e mocha v1.8.2 e npm v1.2.14. Eu estava apenas tentando fazer com que o mocha usasse a unidade / teste de caminho para encontrar meus testes. Depois de gastar muito tempo e tentar várias coisas, consegui

O uso da opção "test / unit / *. Js" não funciona no Windows. Por boas razões, o shell do Windows não expande curingas como o unixen.

No entanto, o uso de "teste / unidade" funciona, sem o padrão de arquivo. por exemplo. "mocha test / unit" executa todos os arquivos encontrados na pasta test / unit.

Isso ainda executa apenas os arquivos de uma pasta como testes, mas você pode passar vários nomes de diretório como parâmetros.

Também para executar um único arquivo de teste, você pode especificar o caminho completo e o nome do arquivo. por exemplo. "teste mocha / unit / mytest1.js"

Na verdade, eu configurei no package.json para o npm "scripts": {"test": "mocha test / unit"},

Para que 'npm test' execute meus testes de unidade.


11
A partir de hoje, pode-se usar a --recursiveopção da seguinte maneira:mocha --recursive "some_dir"
superjos

3
Usando node_modules\.bin\mocha "test\unit\*.js"funciona no Windows. Também node_modules\.bin\mocha "**\*.js"funciona (meu caso real). Mas estou procurando uma maneira de excluir o diretório node_modules . (Eu uso gulpfile.js também, mas em algum momento eu preciso para teste de lançamento diretamente com mocha)
Alex 75

3

Se você estiver usando nodejs, na sua package.jsonsobscripts

  1. Para global (-g)instalações: "test": "mocha server-test"ou "test": "mocha server-test/**/*.js"para subdocumentos
  2. Para projectinstalações: "test": "node_modules/mocha/bin/mocha server-test"ou "test": "node_modules/mocha/bin/mocha server-test/**/*.js"para subdocumentos

Em seguida, basta executar seus testes normalmente como npm test


Estou descobrindo que npm run mocha "./test/*.spec.js!(~)"ignora o argumento da glob, mas node_modules/.bin/mocha "./test/*.spec.js!(~)"não.
ironchicken

@ironchicken para passar argumentos para "npm run" use - como emnpm run mocha -- yourArgs
Pedro A

3

Como mencionado por @superjos nos comentários, use

mocha --recursive "some_dir"


2

Este não parece ser um suporte "fácil" para alterar o diretório de teste.
No entanto, talvez você deva dar uma olhada nesse problema , em relação à sua pergunta.


2

Como @ jeff-dickey sugeriu, na raiz do seu projeto, crie uma pasta chamada test. Nessa pasta, crie um arquivo chamado mocha.opts. Agora, quando tento melhorar a resposta de Jeff, o que funcionou para mim foi, em vez de especificar o nome de apenas uma pasta de teste, especifiquei um padrão para encontrar todos os testes a serem executados no meu projeto, adicionando esta linha:

*/tests/*.js --recursive no mocha.opts

Se você deseja especificar as pastas exatas para procurar testes, fiz algo assim:

shared/tests/*.js --recursive
server/tests/graph/*.js --recursive

Espero que isso ajude quem precisa mais do que as outras respostas fornecem

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.