Comment puis-je me concentrer sur une spécification dans jasmine.js?


154

J'ai un tas de spécifications qui échouent suite à un changement architectural assez important. J'aimerais travailler à les corriger un par un en étiquetant chacun avec «focus».

Est-ce que jasmine.js a une fonctionnalité comme celle-ci? J'ai juré d'avoir lu à un moment donné que c'était le cas, mais je ne le vois pas dans la documentation.


1
La réponse récente de @ phil-pirozhkov souligne que cela a été introduit dans Jaswine dans la v2.1
Alxndr

Réponses:


56

Vous pouvez exécuter une seule spécification en utilisant l'URL de la spécification

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

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

}) 

Maintenant, vous pouvez exécuter uniquement la spécification entière par cette URL http://localhost:8888?spec=MySpecet un premier test avechttp://localhost:8888?spec=MySpec+function+1


10
Ou cliquez simplement sur les spécifications ou les tests individuels sur la page de résultats
jackocnr

Impressionnant. Maintenant, comment puis-je le faire exécuter celui-ci: describe("MySpec", ...)et non celui-ci describe("MySpec blah blah", ...):? Il semble faire une correspondance de sous-chaîne.
Ian Phillips

describe.only est la bonne réponse si vous utilisez jasmine 2.0, pas sûr des autres versions.
davidjnelson le

http://localhost:8888?spec=function+1devrait fonctionner aussi (souvent pas besoin de spécifier MySpec)
lee penkman

123
fdescribe,fit
basarat

269

Lorsque vous utilisez Karma, vous ne pouvez activer qu'un seul test avec fitou fdescribe( iitet ddescribedans Jasmine avant 2.1).


Cela ne fonctionne que Spec1:

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

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

Cela ne fonctionne que testA:

describe('Spec1', function () {

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

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

});

7
c'est un bon conseil, mais actuellement il n'est pas en jasmin. ceci est autorisé par les testeurs comme le karma. pour plus d'informations, lisez sur: github.com/pivotal/jasmine/pull/309
p1100i

77
Jasmine 2.1 présente ceci comme fdescribeet fit: github.com/jasmine/jasmine/commit/…
alxndr

10
Vous devrez faire attention à ne pas valider les spécifications ii ou dd. Facile de rater quelque chose comme ça.
Rimian

@jameshfisher la question a été posée en 2011. De plus, iitil ddescribey a des ajouts de Karma, pas de Jasmine.
Justus Romijn

Suis - je le seul qui pense que le mélange xitet fiten itsont difficiles à lire et sujette à l' erreur?
B Seven

119

Dans le noyau depuis 2.1 avec fitet fdescribe.


1
Lorsque j'utilise 'fit' et que j'exécute mes tests dans la console en utilisant le karma, je peux voir beaucoup de tests ignorés, mais pour voir les erreurs de test, je dois faire défiler vers le haut. Lorsque j'exécute des tests sans «ajustement», je n'ai pas ce problème, car j'ai un résumé des erreurs en bas. Savez-vous comment résoudre ce problème?
tytyryty

25

Pour tous ceux qui tombent dessus, une meilleure approche, que vous pouvez configurer à partir du code lui-même, consiste à utiliser ce plugin: https://github.com/davemo/jasmine-only

Il vous permet de définir l'exclusivité des spécifications directement sur le code comme ceci:

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(){}) 

Il y a eu une longue discussion pour ajouter ceci au noyau de Jasmine, voir: https://github.com/pivotal/jasmine/pull/309

Si vous utilisez Jasmine via Karma / Testacular, vous devriez déjà avoir accès à ddescribe()etiit()


12
+1 pour ddescribe et iit ... Cela devrait être la réponse acceptée.
Seth Flowers

C'est mieux ... Notez également que la nouvelle syntaxe est fdescribeet fit- "f" signifie "concentré". Voir aussi jasmine.github.io/2.1/focused_specs.html
Ezekiel Victor

25

Il y a plusieurs façons de le faire.

Il y a: la fonctionnalité de Jasmine Focused Specs (2.2): http://jasmine.github.io/2.2/focused_specs.html

Les spécifications de mise au point feront en sorte qu'elles soient les seules spécifications qui fonctionnent. Toute spécification déclarée avec fit est focalisée.

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();
  });
});

Cependant, je n'aime pas vraiment l'idée de modifier mes tests (fit et fdescribe) pour les exécuter de manière sélective. Je préfère utiliser un testeur comme karma qui peut filtrer les tests en utilisant une expression régulière.

Voici un exemple utilisant grunt .

$ grunt karma:dev watch --grep=mypattern

Si vous utilisez gulp (qui est mon lanceur de tâches préféré), vous pouvez passer des arguments dans gulp-karma avec des yargs et des modèles de correspondance en définissant la configuration de karma.

Un peu comme ça:

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);

Voir mon essentiel: https://gist.github.com/rimian/0f9b88266a0f63696f21

Alors maintenant, je peux exécuter une seule spécification en utilisant la description:

Mon essai local: (Exécuté 1 sur 14 (ignoré 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

Voir également: https://github.com/karma-runner/karma-jasmine


J'aime votre idée d'utiliser grunt pour exécuter des tests de manière sélective, mais j'aimerais que la configuration de gulp et karma soit plus flexible, plus facile à étendre et plus facile à comprendre d'ailleurs.
nocarrier

8

Vous pouvez créer toutes vos spécifications à l'avance, mais les désactiver avec xdescribeet xitjusqu'à ce que vous soyez prêt à les tester.

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

Avec Jasmine autonome (2.0.0), sur le spec_runner.htlm, je pourrais cliquer sur une spécification spécifique et me concentrer sur cette spécification. J'aurais dû remarquer cette fonctionnalité plus tôt.


1

Pas exactement ce que vous avez demandé, mais l'ajout iittestera uniquement cette spécification particulière et ignorera toutes les autres dans le fichier, ddescribefonctionne de la même manière. Ainsi, vous pouvez vous concentrer sur une spécification particulière en utilisant iitouddescribe


1

C'est la réponse la plus simplifiée avec un exemple pratique. Même dans fdescribe, vous pouvez exécuter quelques blocs it en l'utilisant. f signifie concentration.

De plus, dans un bloc non fdescribe qui est juste décrit, vous pouvez sélectionner uniquement des blocs spécifiques en les marquant comme adaptés.

Veuillez exécuter le code ci-dessous et observer le journal de la console, lire également les commentaires dans le code. Lisez l'article de cet auteur, cela aide aussi. 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");
        }); 
      });
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.