Come posso concentrarmi su una specifica in jasmine.js?


154

Ho un sacco di specifiche fallite da un cambiamento architettonico piuttosto grande. Mi piacerebbe lavorare su come risolverli uno per uno contrassegnandoli con 'focus'.

Jasmine.js ha una funzionalità come questa? Ho giurato di aver letto ad un certo punto che lo fa, ma non lo vedo nei documenti.


1
La recente risposta di @ phil-pirozhkov sottolinea che questo è stato introdotto a Jaswine nella versione 2.1
alxndr il

Risposte:


56

Puoi eseguire una singola specifica usando l'URL per la specifica

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

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

}) 

Ora puoi eseguire solo tutte le specifiche di questo URL http://localhost:8888?spec=MySpece un primo test conhttp://localhost:8888?spec=MySpec+function+1


10
Oppure fai clic su specifiche o singoli test nella pagina dei risultati
jackocnr,

Eccezionale. Ora, come faccio a farlo funzionare questo: describe("MySpec", ...)e non questo describe("MySpec blah blah", ...):? Sembra che stia facendo una partita di sottostringa.
Ian Phillips,

description.only è la risposta corretta se si utilizza jasmine 2.0, non sono sicuro di altre versioni.
davidjnelson,

http://localhost:8888?spec=function+1dovrebbe funzionare troppo (spesso non è necessario specificare MySpec)
lee penkman,

123
fdescribe,fit
basarat,

269

Quando si utilizza Karma, è possibile abilitare un solo test con fito fdescribe( iite ddescribein Jasmine prima della 2.1).


Questo funziona solo Spec1:

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

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

Questo funziona solo testA:

describe('Spec1', function () {

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

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

});

7
è un buon consiglio, ma attualmente non è in gelsomino. questo è consentito da testisti come il karma. per maggiori informazioni continua a leggere: github.com/pivotal/jasmine/pull/309
p1100i

77
Jasmine 2.1 introduce questo come fdescribee fit: github.com/jasmine/jasmine/commit/…
alxndr

10
Dovresti stare attento a non impegnare specifiche ii o dd. Facile perdere qualcosa del genere.
Rimian,

@jameshfisher la domanda è stata posta nel 2011. Inoltre, iite ddescribesono aggiunte di Karma, non di Jasmine.
Justus Romijn,

Sono l'unico a pensare che mescolare xite fitin itsia difficile da leggere e soggetto a errori?
B Seven,

119

In core dal 2.1 con fite fdescribe.


1
Quando uso 'fit' ed eseguo i miei test in console usando karma, posso vedere molti test saltati, ma per vedere gli errori di test ho bisogno di scorrere verso l'alto. Quando eseguo i test senza "adattamento" non ho questo problema, in quanto ho un riepilogo degli errori in fondo. Sai come risolvere questo problema?
tytyryty,

25

Per chiunque inciampare in questo, un approccio migliore, che puoi impostare dal codice stesso, è usare questo plugin: https://github.com/davemo/jasmine-only

Ti consente di impostare l'esclusività delle specifiche proprio sul codice in questo modo:

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

C'è stata una lunga discussione per aggiungere questo al core di Jasmine, vedi: https://github.com/pivotal/jasmine/pull/309

Se ti capita di usare Jasmine tramite Karma / Testacular, dovresti già avere accesso a ddescribe()eiit()


12
+1 per ddescribe e iit ... Questa dovrebbe essere la risposta accettata.
Seth Flowers,

Questo è il migliore ... Nota anche che la nuova sintassi è fdescribee fit- "f" significa "focalizzato". Vedi anche jasmine.github.io/2.1/focused_specs.html
Ezechiele Vittorio

25

Ci sono alcuni modi in cui puoi farlo.

C'è: Funzionalità di Jasmine Focused Specs (2.2): http://jasmine.github.io/2.2/focused_specs.html

Le specifiche di messa a fuoco lo faranno in modo che siano le uniche specifiche che vengono eseguite. Qualsiasi specifica dichiarata adatta è focalizzata.

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

Tuttavia, non mi piace l'idea di modificare i miei test (fit e fdescribe) per eseguirli in modo selettivo. Preferisco usare un test runner come il karma che può filtrare i test usando un'espressione regolare.

Ecco un esempio usando grugnito .

$ grunt karma:dev watch --grep=mypattern

Se stai usando gulp (che è il mio task runner preferito), puoi passare argomenti in gulp-karma con yarg e schemi di corrispondenza impostando la configurazione del karma.

Un po 'così:

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

Vedi il mio succo: https://gist.github.com/rimian/0f9b88266a0f63696f21

Quindi ora posso eseguire una singola specifica usando la descrizione:

Esecuzione del test locale: (eseguito 1 su 14 (ignorato 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

Vedi anche: https://github.com/karma-runner/karma-jasmine


Mi piace la tua idea di usare il grugnito per eseguire i test in modo selettivo, ma vorrei che la configurazione di gulp e karma fosse più flessibile, più facile da estendere e più facile da capire.
nocarrier,

8

Puoi creare tutte le tue specifiche in anticipo ma disabilitarle con xdescribee xitfino a quando non sei pronto per testarle.

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 stand-alone (2.0.0), su spec_runner.htlm, ho potuto fare clic su una specifica specifica e concentrarmi su quella specifica. Avrei dovuto notare questa funzione prima.


1

Non esattamente quello che hai chiesto, ma l'aggiunta iitmetterà alla prova solo quella specifica specifica e ignorerà tutte le altre nel file, ddescribefunziona allo stesso modo. Quindi puoi concentrarti su una specifica specifica usando iitoddescribe


1

Questa è la risposta più semplificata con un esempio pratico. Anche in fdescribe è possibile eseguire pochi blocchi usando. f significa focus.

Anche in un blocco nessuno descrittivo che è appena descritto, è possibile selezionare solo blocchi specifici contrassegnandoli come adatti.

Si prega di eseguire il codice seguente e osservare il registro della console, leggere anche i commenti nel codice. Leggi l'articolo di questo autore aiuta anche. 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");
        }); 
      });
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.