web-dev-qa-db-fra.com

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

J'ai un tas de spécifications défaillantes d'un changement architectural assez important. Je voudrais travailler sur les réparer un par un en marquant chacun avec "focus".

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

143
Dane O'Connor

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 les spécifications complètes par cette URL http://localhost:8888?spec=MySpec et un premier test avec http://localhost:8888?spec=MySpec+function+1

53
Andreas Köberle

Lorsque vous utilisez Karma, vous ne pouvez activer qu'un seul test avec fit ou fdescribe (iit et ddescribe dans Jasmine avant la version 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 fait que lancer testA:

describe('Spec1', function () {

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

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

});
248
Hudvoy

En noya depuis 2.1 avec fit et fdescribe.

117
phil pirozhkov

Il y a plusieurs façons de le faire.

Il y a: Caractéristique de Jasmin Spécifications focalisées (2.2): http://jasmine.github.io/2.2/focused_specs.html =

Les spécifications de mise au point feront en sorte que ce soient les seules spécifications exécutées. Toute spécification déclarée avec ajustement est ciblé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 trop l'idée de modifier mes tests (fit et description) pour les exécuter de manière sélective. Je préfère utiliser un exécuteur de tests tel que karma qui peut filtrer les tests à l'aide d'une expression régulière.

Voici un exemple utilisant grunt .

$ grunt karma:dev watch --grep=mypattern

Si vous utilisez gulp (qui est mon coureur de tâche préféré), vous pouvez passer les arguments en gulp-karma avec yargs et correspondre à des modèles 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 résumé: https://Gist.github.com/rimian/0f9b88266a0f63696f21

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

Mon test 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 aussi: https://github.com/karma-runner/karma-jasmine

24
Rimian

Pour quiconque s'embarrassant sur ceci, une meilleure approche, que vous pouvez configurer à partir du code lui-même, consiste à utiliser ce plugin: https://github.com/davemo/jasmine-only

Cela vous permet de définir l'exclusivité sur le code comme suit:

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 obtenir cela ajouté au noyau Jasmine, voir: https://github.com/pivotal/jasmine/pull/309

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

24
albemuth

Vous pouvez créer toutes vos spécifications dès le départ, mais les désactiver avec xdescribe et xit jusqu'à 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 () {
  });
});
8
Eric Bock

Ce n'est pas exactement ce que vous avez demandé, mais ajouter iit ne testera que cette spécification particulière et ignorera tous les autres éléments du fichier. ddescribe fonctionnera de la même manière. Ainsi, vous pouvez vous concentrer sur une spécification particulière en utilisant iit ou ddescribe

1
Filype

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

1
taro