¿Cómo me concentro en una especificación en jasmine.js?


154

Tengo un montón de especificaciones fallidas de un cambio arquitectónico bastante grande. Me gustaría trabajar en solucionarlos uno por uno etiquetando cada uno con 'foco'.

¿Tiene jazmín.js una característica como esta? Juré que leí en un punto que sí, pero no lo veo en los documentos.


1
La respuesta reciente de @ phil-pirozhkov señala que esto fue presentado a Jaswine en v2.1
alxndr

Respuestas:


56

Puede ejecutar una sola especificación utilizando la url para la especificación

describe("MySpec", function() { 
  it('function 1', function() { 
    //... 
  }) 

  it('function 2', function() { 
    //... 
  } 

}) 

Ahora puede ejecutar solo la especificación completa con esta url http://localhost:8888?spec=MySpecy la primera prueba conhttp://localhost:8888?spec=MySpec+function+1


10
O simplemente haga clic en las especificaciones o pruebas individuales en la página de resultados
jackocnr

Increíble. Ahora, ¿cómo hago para ejecutar este: describe("MySpec", ...)y no este describe("MySpec blah blah", ...):? Parece estar haciendo una coincidencia de subcadena.
Ian Phillips

describe.only es la respuesta correcta si usa jazmín 2.0, no estoy seguro acerca de otras versiones.
davidjnelson

http://localhost:8888?spec=function+1debería funcionar también (a menudo no es necesario especificar MySpec)
lee penkman

123
fdescribe,fit
basarat

269

Al usar Karma, puede habilitar solo una prueba con fito fdescribe( iity ddescribeen Jasmine antes de 2.1).


Esto solo funciona Spec1:

// or "ddescribe" in Jasmine prior 2.1
fdescribe('Spec1', function () {
    it('should do something', function () {
        // ...
    });
});

describe('Spec2', function () {
    it('should do something', function () {
        // ...
    });
});

Esto solo funciona testA:

describe('Spec1', function () {

    // or "iit" in Jasmine prior 2.1
    fit('testA', function () {
        // ...
    });

    it('testB', function () {
        // ...
    });

});

77
Es un buen consejo, pero actualmente no está en jazmín. esto es permitido por corredores de prueba como el karma. para obtener más información, lea: github.com/pivotal/jasmine/pull/309
p1100i

77
Jasmine 2.1 presenta esto como fdescribey fit: github.com/jasmine/jasmine/commit/…
alxndr

10
Tendría que tener cuidado de no confirmar las especificaciones ii o dd. Es fácil perderse algo así.
Rimian

@jameshfisher la pregunta se hizo en 2011. Además, iity ddescribeson adiciones de Karma, no de Jasmine.
Justus Romijn

¿Soy el único que piensa que la mezcla xity fiten itson difíciles de leer y propenso a errores?
B Seven

119

En núcleo desde 2.1 con fity fdescribe.


1
Cuando uso 'fit' y ejecuto mis pruebas en la consola usando karma, puedo ver muchas pruebas omitidas, pero para ver los errores de prueba necesito desplazarme hacia la parte superior. Cuando ejecuto pruebas sin 'ajuste' no tengo ese problema, ya que tengo un resumen de errores en la parte inferior. ¿Sabes cómo solucionar este problema?
tytyryty

25

Para cualquiera que se encuentre con esto, un mejor enfoque, que puede configurar desde el propio código, es utilizar este complemento: https://github.com/davemo/jasmine-only

Le permite establecer la exclusividad de especificaciones en el código de esta manera:

describe.only("MySpec", function() { 
  it('function 1', function() { 
    //... 
  }) 

  it.only('function 2', function() { 
    //... 
  }
})
// This won't be run if there are specs using describe.only/ddescribe or it.only/iit
describe("Spec 2", function(){}) 

Ha habido una larga discusión para agregar esto al núcleo de Jasmine, ver: https://github.com/pivotal/jasmine/pull/309

Si está utilizando Jasmine a través de Karma / Testacular, ya debería tener acceso ddescribe()yiit()


12
+1 para ddescribe e iit ... Esta debería ser la respuesta aceptada.
Seth Flowers

Esto es lo mejor ... También tenga en cuenta que la nueva sintaxis es fdescribey fit- "f" significa "enfocado". Ver también jasmine.github.io/2.1/focused_specs.html
Ezekiel Victor

25

Hay algunas formas de hacerlo.

Hay: Especificaciones enfocadas de la característica de Jasmine (2.2): http://jasmine.github.io/2.2/focused_specs.html

Las especificaciones de enfoque harán que sean las únicas especificaciones que se ejecutan. Cualquier especificación declarada con ajuste está enfocada.

describe("Focused specs", function() {
  fit("is focused and will run", function() {
    expect(true).toBeTruthy();
  });

  it('is not focused and will not run', function(){
    expect(true).toBeFalsy();
  });
});

Sin embargo, no me gusta la idea de editar mis pruebas (ajustar y describir) para ejecutarlas selectivamente. Prefiero usar un corredor de prueba como el karma que puede filtrar las pruebas usando una expresión regular.

Aquí hay un ejemplo usando gruñido .

$ grunt karma:dev watch --grep=mypattern

Si está usando gulp (que es mi corredor de tareas favorito), puede pasar args en gulp-karma con hilos y patrones de coincidencia configurando la configuración de karma.

Un poco como esto:

var Args = function(yargs) {
  var _match = yargs.m || yargs.match;
  var _file = yargs.f || yargs.file;
  return {
    match: function() { if (_match) { return {args: ['--grep', _match]} } }
  };
}(args.argv);


var Tasks = function() {
  var test = function() {
    return gulp.src(Files.testFiles)
      .pipe(karma({ configFile: 'karma.conf.js', client: Args.match()}))
      .on('error', function(err) { throw err; });
  };

  return {
    test: function() { return test() }
  }
}(Args);

gulp.task('default', ['build'], Tasks.test);

Vea mi esencia: https://gist.github.com/rimian/0f9b88266a0f63696f21

Entonces, ahora puedo ejecutar una sola especificación usando la descripción:

Mi ejecución de prueba local: (Ejecutado 1 de 14 (saltado 13))

gulp -m 'triggers the event when the API returns success'
[20:59:14] Using gulpfile ~/gulpfile.js
[20:59:14] Starting 'clean'...
[20:59:14] Finished 'clean' after 2.25 ms
[20:59:14] Starting 'build'...
[20:59:14] Finished 'build' after 17 ms
[20:59:14] Starting 'default'...
[20:59:14] Starting Karma server...
INFO [karma]: Karma v0.12.31 server started at http://localhost:9876/
INFO [launcher]: Starting browser Chrome
WARN [watcher]: All files matched by "/spec/karma.conf.js" were excluded.
INFO [Chrome 42.0.2311 (Mac OS X 10.10.3)]: Connected on socket hivjQFvQbPdNT5Hje2x2 with id 44705181
Chrome 42.0.2311 (Mac OS X 10.10.3): Executed 1 of 14 (skipped 13) SUCCESS (0.012 secs / 0.009 secs)
[20:59:16] Finished 'default' after 2.08 s

Ver también: https://github.com/karma-runner/karma-jasmine


Me gusta su idea de usar Grunt para ejecutar selectivamente pruebas, pero deseo que la configuración de gulp y karma sea más flexible, más fácil de extender y más fácil de entender.
nocarrier

8

Puede crear todas sus especificaciones por adelantado, pero deshabilitarlas con xdescribey xithasta que esté listo para probarlas.

describe('BuckRogers', function () {
  it('shoots aliens', function () {
    // this will be tested
  });

  xit('rescues women', function () {
    // this won't
  });
});

// this whole function will be ignored
xdescribe('Alien', function () {
  it('dies when shot', function () {
  });
});

1

Con Jasmine independiente (2.0.0), en spec_runner.htlm, podría hacer clic en una especificación específica y centrarme en esa especificación. Debería haber notado esta característica antes.


1

No es exactamente lo que ha pedido, pero agregar iitsolo probará esa especificación particular e ignorará todas las demás en el archivo, ddescribefunciona de la misma manera. Para que pueda centrarse en una especificación particular usando iitoddescribe


1

Esta es la respuesta más simplificada con un ejemplo práctico. Incluso en fdescribe puede ejecutar pocos bloques usando. f significa foco.

También en un bloque sin descripción que solo se describe, puede seleccionar solo bloques específicos al marcarlos como adecuados.

Ejecute el siguiente código y observe el registro de la consola, también lea los comentarios en el código. Lea el artículo de este autor que también ayuda. https://davidtang.io/2016/01/03/controlling-which-tests-run-in-jasmine.html

 //If you want to run few describe only add f so using focus those describe blocks and it's it block get run

  fdescribe("focus description i get run with all my it blocks ", function() {
    it("1 it in fdescribe get executed", function() {
        console.log("1 it in fdescribe get executed unless no fit within describe");

    });
    it("2 it in fdescribe get executed", function() {
        console.log("2 it in fdescribe get executed unless no fit within describe");

    });
    //but if you and fit in fdescribe block only the fit blocks get executed
    fit("3  only fit blocks in  fdescribe get executed", function() {
        console.log("If there is  a fit   in fdescribe only fit blocks  get executed");

    });
  });

  describe("none description i get skipped with all my it blocks ", function() {
        it("1 it in none describe get skipped", function() {
            console.log("1 it in none describe get skipped");

        });
        it("2 it in none describe get skipped", function() {
            console.log("2 it in none describe get skipped");
        });
//What happen if we had fit in a none fdescribe block will it get run ?   yes  
       fit("3 fit in none describe get executed too eventhough it;s just describe ", function() {
            console.log("3 fit in none describe get executed too");
        }); 
      });
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.