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.
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
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 () {
// ...
});
});
En noya depuis 2.1 avec fit
et fdescribe
.
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
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()
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 () {
});
});
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
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.