Como executar um único teste com o Mocha?

292

Eu uso o Mocha para testar minhas coisas de JavaScript. Meu arquivo de teste contém 5 testes. É possível executar um teste específico (ou conjunto de testes) em vez de todos os testes no arquivo?

Misha Moroshko
fonte

Respostas:

355

Tente usar a --grepopção do mocha :

    -g, --grep <pattern>            only run tests matching <pattern>

Você pode usar qualquer regex JavaScript válido como <pattern>. Por exemplo, se tivermos test/mytest.js:

it('logs a', function(done) {
  console.log('a');
  done();
});

it('logs b', function(done) {
  console.log('b');
  done();
});

Então:

$ mocha -g 'logs a'

Para executar um único teste. Observe que isso aparece entre os nomes de todos describe(name, fn)e it(name, fn)invocações.

Considere o uso de describe()chamadas aninhadas para namespacing para facilitar a localização e a seleção de conjuntos específicos.

Asherah
fonte
1
Obrigado! Fiquei com a impressão de que --grepapenas filtrava as @tags.
precisa saber é o seguinte
5
Ao usar o Mocha de forma programática (por exemplo, do Grunt), existe um problema: a opção grep precisa ser um objeto 'RegExp ()'. Se for uma string, ela será escapada.
precisa saber é o seguinte
1
esta é a única solução que funcionou para mim. especificar arquivos na linha de comando ( mocha some/test.js) não funcionou. obrigado!
Hraban
2
Alguma maneira de evitar também a execução logs a bcdque contém a logs asubstring? Regexp ^$não está funcionando no 0.10.2.
Ciro Santilli escreveu:
Eu recebo alguns erros se eu não especificar o diretório como mocha -g 'logs a'.
kta 12/04
166

Dependendo do seu padrão de uso, você pode gostar de usar apenas . Nós usamos o estilo TDD; Se parece com isso:

test.only('Date part of valid Partition Key', function (done) {
    //...
}

Somente este teste será executado em todos os arquivos / suítes.

J Burnett
fonte
5
BDD funciona da mesma maneira. Isso é ótimo para quando você está trabalhando em um único teste. Ele também pode ser usado na suíte / descrever o nível
andyzinsser
14
Com chai e espere sintaxe que seria it.only.
precisa saber é
4
Esta resposta é melhor, uma vez que também irá trabalho quando mocha é usado de karma dentro, etc.
Vivek Kodira
2
it.onlynão vai trabalhar em conjunto com givende mocha-testdata . E é fácil esquecer de removê-lo mais tarde.
Tr1et 26/05
4
eslint-plugin-mochatem uma regra no-exclusive-testsque o pegará se você esquecer de removê-lo .only.
dostu
84

Se você estiver usando npm test(usando scripts package.json), use um extra --para passar o parâmetro para o mocha

por exemplo npm test -- --grep "my second test"

EDIT : Parece que --greppode ser um pouco exigente (provavelmente dependendo dos outros argumentos). Você pode:

Modifique o package.json:

"test:mocha": "mocha --grep \"<DealsList />\" .",

Ou então use o --bailque parece ser menos exigente

npm test -- --bail
Ashley Coolman
fonte
3
Trabalhou para mim. Obrigado :)
Jill-Jênn Vie 8/16
1
@ Andy --grep pode ser um pouco exigente - tente colocá-lo logo após o mocha na entrada de script npm. Outra coisa npm test -- --bailé útil para salvamento após o primeiro teste que falha
Ashley Coolman
1
passando traços extras antes de --grepsalvar meu dia! Muito obrigado. PS. Eu estou no Windows, rodandonpm test -- --grep @tag
Mykola
18

executar teste único - por nome de arquivo -

Na verdade, também é possível executar um único teste de mocha por nome de arquivo (não apenas por „it () - string-grepping“) se você remover o padrão glob (por exemplo ./test/**/*.spec.js) do seu mocha.opts, criar uma cópia, respectivamente:

node_modules/.bin/mocha --opts test/mocha.single.opts test/self-test.spec.js

Aqui está o meu mocha.single.opts (só é diferente em perder a linha glob acima mencionada)

--require ./test/common.js
--compilers js:babel-core/register
--reporter list
--recursive

Antecedentes: Embora você possa substituir as várias opções do arquivo opts (começando com --), você não pode substituir a glob . Esse link também tem algumas explicações.

Dica: se node_modules/.bin/mochaconfunde você, use o pacote local mocha. Você também pode escrever apenas mochase estiver instalado globalmente.


E se você deseja o conforto de package.json: Ainda: remova o **/*globo -ish do seu mocha.opts, insira-o aqui, para todos os testes, deixe-os fora para o único teste:

"test": "mocha ./test/**/*.spec.js",
"test-watch": "mocha -R list -w ./test/**/*.spec.js",
"test-single": "mocha $1",
"test-single-watch": "mocha -R list -w $1",

uso:

> npm run test

respectivamente

> npm run test-single -- test/ES6.self-test.spec.js 

(cuidado com o --!)

Frank Nocke
fonte
$ 1 não era necessário na minha configuração, em vez disso, levava a avisos como: Warning: Could not find any test files matching pattern: $1
Merijn Vogel 13/01
15

Basta usar .only antes de 'descrever', 'isso' ou 'contexto'. Eu corro usando "$ npm run test: unit" e ele executa apenas unidades com .only.

describe.only('get success', function() {
 // ...
});

it.only('should return 1', function() {
  // ...
});
QauseenMZ
fonte
11

Oi soluções acima não funcionou para mim. A outra maneira de executar um único teste é

mocha test/cartcheckout/checkout.js -g 'Test Name Goes here'

Isso ajuda a executar um caso de teste a partir de um único arquivo e com nome específico.

Ruthreshwar
fonte
1
Use uma expressão que seja seletiva o suficiente -ge você não precisará especificar um nome de arquivo. Se você não pode escrever uma expressão que seja seletiva o suficiente, isso significa que você não está nomeando seus testes corretamente.
Louis
10
npm test <filepath>

por exemplo :

npm test test/api/controllers/test.js

aqui 'test / api / controllers / test.js' é o caminho do arquivo.

Jitendra Pawar
fonte
8

Você pode tentar "it.only"

 it.only('Test one ', () => {

            expect(x).to.equal(y);
        });
it('Test two ', () => {

            expect(x).to.equal(y);
        });

neste o primeiro só irá executar

Bikesh M
fonte
2
Perigoso se os testes não forem executados --forbid-onlyno servidor de CI / build. .onlytem uma tendência a se infiltrar na ramificação principal e tornar os outros testes mudos, pois eles simplesmente não serão mais executados. Cheguei a pensar no fluxo de trabalho de alteração de código para executar testes diferentes de um anti-recurso. O executor de teste deve determinar quais testes devem ser executados (também conhecidos como testes marcados) e não o desenvolvedor.
k0pernikus
Eu usei isso para testar uma funcionalidade no meu local, Nota: não confirmar o código com it.onlya repo #
Bikesh M
0

Não sei por que o método grep não está funcionando para mim ao usar o teste npm. Isso funciona embora. Eu também preciso especificar a pasta de teste também por algum motivo.

teste npm - test / sometest.js

Andy N
fonte
0

Consolide todos os seus testes em um arquivo test.js e seu pacote json add scripts como:

  "scripts": {
  "api:test": "node_modules/.bin/mocha --timeout 10000 --recursive api_test/"
},

Digite o comando no seu diretório de teste:

npm run api:test
Shahin
fonte