¿Cómo ejecutar una sola prueba con Mocha?

292

Yo uso Mocha para probar mis cosas de JavaScript. Mi archivo de prueba contiene 5 pruebas. ¿Es posible ejecutar una prueba específica (o un conjunto de pruebas) en lugar de todas las pruebas en el archivo?

Misha Moroshko
fuente

Respuestas:

355

Intenta usar la --grepopción de mocha :

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

Puede usar cualquier expresión regular de JavaScript válida como <pattern>. Por ejemplo, si tenemos test/mytest.js:

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

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

Luego:

$ mocha -g 'logs a'

Para ejecutar una sola prueba. Tenga en cuenta que esto agrupa los nombres de todos describe(name, fn)y las it(name, fn)invocaciones.

Considere el uso de describe()llamadas anidadas para el espacio de nombres para facilitar la localización y selección de conjuntos particulares.

Asera
fuente
1
¡Gracias! Tenía la impresión de que --grepsolo se filtraba de las @etiquetas.
kumarharsh
55
Cuando se usa Mocha mediante programación (por ejemplo, de Grunt), hay una opción catch: grep debe ser un objeto ´RegExp () ´. Si es una cadena, se escapará.
h-kippo
1
Esta es la única solución que funcionó para mí. especificar archivos en la línea de comando ( mocha some/test.js) no funcionó en absoluto. ¡Gracias!
hraban
2
¿Alguna forma de evitar también ejecutar logs a bcdque contiene la logs asubcadena? Regexp ^$no funciona en 0.10.2.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Gracias. Recibo algunos errores si no especifico el directorio como mocha -g 'registra a'.
kta
166

Dependiendo de su patrón de uso, puede que desee utilizar solamente . Usamos el estilo TDD; se parece a esto:

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

Solo esta prueba se ejecutará desde todos los archivos / suites.

J Burnett
fuente
55
BDD funciona igual. Esto es ideal para cuando está trabajando en una sola prueba. También se puede usar en el nivel suite / describe
andyzinsser
14
Con chai y esperar la sintaxis que sería it.only.
elkelk
44
Esta respuesta es mejor, ya que también el trabajo cuando moka se utiliza en el interior del karma, etc.
Vivek Kodira
2
it.onlyno va a funcionar junto con givende moka-testdata . Y es fácil olvidar eliminarlo más adelante.
Tr1et
44
eslint-plugin-mochatiene una regla no-exclusive-testsque te atrapará si olvidas eliminarlo .only.
Dostu
84

Si está usando npm test(usando los scripts package.json) use un extra --para pasar el parámetro a mocha

p.ej npm test -- --grep "my second test"

EDITAR : Parece que --greppuede ser un poco quisquilloso (probablemente dependiendo de los otros argumentos). Usted puede:

Modifique el paquete.json:

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

O, alternativamente, use el --bailque parece ser menos exigente

npm test -- --bail
Ashley Coolman
fuente
3
Trabajó para mi. Gracias :)
Jill-Jênn Vie
1
@Andy --grep puede ser un poco quisquilloso: intenta colocarlo justo después de mocha dentro de la entrada del script npm. Else npm test -- --bailes útil para rescatar después de la primera prueba fallida
Ashley Coolman
1
pasar guiones adicionales antes de --grepsalvar mi día! Muchas gracias. PD. Estoy en Windows, corriendonpm test -- --grep @tag
Mykola
18

ejecutar una sola prueba –por nombre de archivo–

En realidad, también se puede ejecutar una única prueba de mocha por nombre de archivo (no solo por "it () - grepping de cadenas") si elimina el patrón glob (p ./test/**/*.spec.js. Ej. ) De su mocha.opts, respectivamente, crea una copia, sin:

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

Aquí está mi mocha.single.opts (solo es diferente al perder la línea glob mencionada anteriormente)

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

Antecedentes: si bien puede anular los diversos interruptores del archivo opts (comenzando por --), no puede anular el glob . Ese enlace también tiene algunas explicaciones.

Sugerencia: si node_modules/.bin/mochate confunde, usa el paquete local mocha. También puede escribir solo mocha, si lo tiene instalado globalmente.


Y si desea las comodidades de package.json: Aún así: elimine el **/*globo -ish de su mocha.opts, insértelos aquí, para la prueba completa, déjelos lejos para la prueba individual:

"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 --!)

Frank Nocke
fuente
$ 1 no era necesario en mi configuración, en su lugar, dio lugar a advertencias como: Warning: Could not find any test files matching pattern: $1
Merijn Vogel
15

Solo use .only antes de 'describe', 'it' o 'context'. Ejecuto usando "$ npm run test: unit", y ejecuta solo unidades con .only.

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

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

Hola, las soluciones anteriores no funcionaron para mí. La otra forma de ejecutar una sola prueba es

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

Esto ayuda a ejecutar un caso de prueba desde un solo archivo y con un nombre específico.

Ruthreshwar
fuente
1
Use una expresión que sea lo suficientemente selectiva para -gy no necesitará especificar un nombre de archivo. Si no puede escribir una expresión que sea lo suficientemente selectiva, eso significa que no está nombrando sus pruebas correctamente.
Louis
10
npm test <filepath>

p.ej :

npm test test/api/controllers/test.js

aquí 'test / api / controllers / test.js' es filepath.

Jitendra Pawar
fuente
8

Puedes probar "it.only"

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

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

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

en esto solo se ejecutará el primero

Bikesh M
fuente
2
Peligroso si las pruebas no se ejecutan a través --forbid-onlydel servidor CI / build. .onlytiene una tendencia a colarse en la rama principal y silenciar las otras pruebas, ya que simplemente no se ejecutarán más. Llegué a pensar en el flujo de trabajo de cambiar el código para ejecutar diferentes pruebas y una función anti. El corredor de prueba debe determinar qué pruebas deben ejecutarse (también conocidas como pruebas etiquetadas), no el desarrollador.
k0pernikus
He usado esto para probar una funcionalidad en mi local, Nota: no it.only
confirme el
0

No estoy seguro de por qué el método grep no funciona para mí cuando uso la prueba npm. Sin embargo, esto funciona. También necesito especificar la carpeta de prueba también por alguna razón.

prueba npm - prueba / sometest.js

Andy N
fuente
0

Consolide todas sus pruebas en un archivo test.js y su paquete json agregue scripts como:

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

Escriba el comando en su directorio de prueba:

npm run api:test
Shahin
fuente