Wie konzentriere ich mich auf eine Spezifikation in jasmine.js?

154

Ich habe eine Reihe von fehlerhaften Spezifikationen aufgrund einer ziemlich großen architektonischen Änderung. Ich möchte daran arbeiten, sie einzeln zu beheben, indem ich sie mit "Fokus" markiere.

Hat jasmine.js eine solche Funktion? Ich habe geschworen, dass ich irgendwann gelesen habe, dass dies der Fall ist, aber ich sehe es nicht in den Dokumenten.

Däne O'Connor
quelle
1
@ phil-pirozhkovs jüngste Antwort weist darauf hin, dass dies Jaswine in v2.1
alxndr

Antworten:

56

Sie können eine einzelne Spezifikation ausführen, indem Sie die URL für die Spezifikation verwenden

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

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

}) 

Jetzt können Sie nur die gesamte Spezifikation mit dieser URL http://localhost:8888?spec=MySpecund dem ersten Test mit ausführenhttp://localhost:8888?spec=MySpec+function+1

Andreas Köberle
quelle
10
Oder klicken Sie einfach auf Spezifikationen oder einzelne Tests auf der Ergebnisseite
jackocnr
Genial. Wie kann ich es jetzt dazu bringen, dieses auszuführen: describe("MySpec", ...)und nicht dieses : describe("MySpec blah blah", ...)? Es scheint ein Teilstring-Match zu sein.
Ian Phillips
Nur bei Verwendung von Jasmin 2.0 ist die richtige Antwort nicht sicher, bei anderen Versionen nicht sicher.
Davidjnelson
http://localhost:8888?spec=function+1sollte auch funktionieren (oft muss MySpec nicht angegeben werden)
Lee Penkman
122
fdescribe,fit
Basarat
268

Wenn Sie Karma verwenden, können Sie nur einen Test mit fitoder fdescribe( iitund ddescribein Jasmine vor 2.1) aktivieren .


Dies läuft nur Spec1:

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

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

Dies läuft nur testA:

describe('Spec1', function () {

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

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

});
Hudvoy
quelle
7
Es ist ein guter Tipp, aber derzeit ist es nicht in Jasmin. Dies wird von Testläufern wie Karma erlaubt. Weitere Informationen finden Sie unter: github.com/pivotal/jasmine/pull/309
p1100i
77
Jasmine 2.1 führt dies als fdescribeund ein fit: github.com/jasmine/jasmine/commit/…
alxndr
10
Sie müssten vorsichtig sein, um keine II- oder DD-Spezifikationen festzulegen. So etwas ist leicht zu übersehen.
Rimian
@ Jameshfisher Die Frage wurde im Jahr 2011 gestellt. Auch iitund ddescribesind Ergänzungen von Karma, nicht Jasmin.
Justus Romijn
Bin ich der einzige, der denkt, dass Mixing xitund fitIn itschwer zu lesen und fehleranfällig sind?
B Sieben
119

Im Kern seit 2.1 mit fitund fdescribe.

phil pirozhkov
quelle
1
Wenn ich 'fit' verwende und meine Tests in der Konsole mit Karma ausführe, kann ich viele übersprungene Tests sehen, aber um Testfehler zu sehen, muss ich nach oben scrollen. Wenn ich Tests ohne 'fit' durchführe, habe ich kein solches Problem, da ich unten eine Fehlerzusammenfassung habe. Wissen Sie, wie Sie dieses Problem beheben können?
Tytyryty
25

Für alle, die darüber stolpern, ist es besser, dieses Plugin zu verwenden: https://github.com/davemo/jasmine-only

Damit können Sie die Spezifikations-Exklusivität direkt für den Code wie folgt festlegen:

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

Es gab eine lange Diskussion, um dies zum Jasmin-Kern hinzuzufügen, siehe: https://github.com/pivotal/jasmine/pull/309

Wenn Sie Jasmine zufällig über Karma / Testacular verwenden, sollten Sie bereits Zugriff auf ddescribe()und habeniit()

Albemuth
quelle
12
+1 für ddescribe und iit ... Dies sollte die akzeptierte Antwort sein.
Seth Flowers
Dies ist am besten ... Beachten Sie auch, dass die neue Syntax fdescribeund fit- "f" bedeutet "fokussiert". Siehe auch jasmine.github.io/2.1/focused_specs.html
Ezekiel Victor
25

Es gibt einige Möglichkeiten, wie Sie dies tun können.

Es gibt: Jasmines Feature Focused Specs (2.2): http://jasmine.github.io/2.2/focused_specs.html

Wenn Sie die Spezifikationen fokussieren, werden sie als einzige Spezifikationen ausgeführt. Jede mit fit deklarierte Spezifikation ist fokussiert.

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

Die Idee, meine Tests (fit und fdescribe) so zu bearbeiten, dass sie selektiv ausgeführt werden, gefällt mir jedoch nicht wirklich. Ich bevorzuge einen Testläufer wie Karma, der Tests mit einem regulären Ausdruck herausfiltern kann.

Hier ist ein Beispiel mit Grunzen .

$ grunt karma:dev watch --grep=mypattern

Wenn Sie gulp verwenden (das ist mein Lieblings-Task-Runner), können Sie Argumente mit Yargs an gulp-karma übergeben und Muster abgleichen, indem Sie die Konfiguration von karma festlegen.

Ein bisschen wie das:

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

Siehe mein Kern: https://gist.github.com/rimian/0f9b88266a0f63696f21

Jetzt kann ich eine einzelne Spezifikation mit der folgenden Beschreibung ausführen:

Mein lokaler Testlauf: (1 von 14 ausgeführt (13 übersprungen))

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

Siehe auch: https://github.com/karma-runner/karma-jasmine

Rimian
quelle
Ich mag Ihre Idee, mit Grunzen selektiv Tests durchzuführen, aber ich wünschte, die Konfiguration von Schluck und Karma wäre flexibler, einfacher zu erweitern und in dieser Angelegenheit leichter zu verstehen.
Nocarrier
8

Sie können alle Ihre Ihre Spezifikationen vorne erstellen , aber deaktivieren Sie sie mit xdescribeund xitbis Sie bereit sind , sie zu testen.

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 () {
  });
});
Eric Bock
quelle
1

Mit dem eigenständigen Jasmine (2.0.0) auf spec_runner.htlm konnte ich auf eine bestimmte Spezifikation klicken und mich auf diese eine Spezifikation konzentrieren. Ich hätte diese Funktion früher bemerken sollen.

Taro
quelle
1

Nicht genau das, wonach Sie gefragt haben, aber das Hinzufügen iittestet nur diese bestimmte Spezifikation und ignoriert alle anderen in der Datei. Dies ddescribefunktioniert auf die gleiche Weise. So können Sie sich mit iitoder auf eine bestimmte Spezifikation konzentrierenddescribe

Dateityp
quelle
1

Dies ist die einfachste Antwort mit einem praktischen Beispiel. Selbst in fdescribe können Sie nur wenige it-Blöcke damit ausführen. f bedeutet Fokus.

Auch in einem nicht beschriebenen Block, der nur beschrieben wird, können Sie nur bestimmte IT-Blöcke auswählen, indem Sie sie als passend markieren.

Führen Sie den folgenden Code aus und beachten Sie das Konsolenprotokoll. Lesen Sie auch die Kommentare im Code. Lesen Sie den Artikel dieses Autors, es hilft auch. 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");
        }); 
      });
Sameera De Silva
quelle