Jak mogę skupić się na jednej specyfikacji w jasmine.js?


154

Mam kilka wadliwych specyfikacji z dość dużej zmiany architektonicznej. Chciałbym popracować nad ich naprawieniem jeden po drugim, oznaczając je „fokus”.

Czy Jasmine.js ma taką funkcję? Przysięgałem, że przeczytałem w pewnym momencie, że tak, ale nie widzę tego w dokumentach.


1
Ostatnia odpowiedź @ phil-pirozhkov wskazuje, że zostało to wprowadzone do Jaswine w wersji 2.1
alxndr

Odpowiedzi:


56

Możesz uruchomić pojedynczą specyfikację, używając adresu URL specyfikacji

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

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

}) 

Teraz możesz uruchomić całą specyfikację według tego adresu URL http://localhost:8888?spec=MySpeci pierwszy test za pomocąhttp://localhost:8888?spec=MySpec+function+1


10
Lub po prostu kliknij specyfikacje lub poszczególne testy na stronie wyników
jackocnr

Niesamowite. Teraz, jak mogę go uruchomić ten: describe("MySpec", ...)a nie ten jeden: describe("MySpec blah blah", ...)? Wygląda na to, że dopasowuje podciąg.
Ian Phillips

opisać. tylko jest poprawną odpowiedzią, jeśli używasz jaśminu 2.0, nie jestem pewien co do innych wersji.
davidjnelson

http://localhost:8888?spec=function+1powinno też działać (często nie trzeba podawać MySpec)
lee penkman

123
fdescribe,fit
basarat

269

Korzystając z Karmy, możesz włączyć tylko jeden test z fitlub fdescribe( iiti ddescribew Jasmine przed 2.1).


Działa tylko Spec1:

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

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

Działa tylko testA:

describe('Spec1', function () {

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

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

});

7
to dobra wskazówka, ale obecnie nie jest w jaśminie. jest to dozwolone przez testerów, takich jak karma. aby uzyskać więcej informacji, przeczytaj: github.com/pivotal/jasmine/pull/309
p1100i

77
Jasmine 2.1 wprowadza to jako fdescribei fit: github.com/jasmine/jasmine/commit/ ...
alxndr

10
Musisz uważać, aby nie zatwierdzić specyfikacji II lub DD. Łatwo coś takiego przeoczyć.
Rimian

@jameshfisher pytanie zostało zadane w 2011 roku. Także iiti ddescribesą to dodatki Karmy, a nie Jasmine.
Justus Romijn,

Czy tylko ja uważam, że mieszanie xiti fitwtapianie itsą trudne do odczytania i podatne na błędy?
B Seven

119

W rdzeniu od 2.1 z fiti fdescribe.


1
Kiedy używam „fit” i uruchamiam testy w konsoli przy użyciu karmy, widzę wiele pominiętych testów, ale aby zobaczyć błędy testu, muszę przewinąć do góry. Kiedy uruchamiam testy bez dopasowania nie mam takiego problemu, bo na dole mam podsumowanie błędów. Czy wiesz, jak rozwiązać ten problem?
tytyryty

25

Dla każdego, kto się na to natknie, lepszym podejściem, które można skonfigurować z samego kodu, jest użycie tej wtyczki: https://github.com/davemo/jasmine-only

Pozwala ustawić wyłączność specyfikacji bezpośrednio w kodzie w następujący sposób:

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

Odbyła się długa dyskusja, aby dodać to do rdzenia Jasmine, patrz: https://github.com/pivotal/jasmine/pull/309

Jeśli używasz Jasmine przez Karma / Testacular, powinieneś już mieć dostęp do ddescribe()iiit()


12
+1 dla ddescribe i iit ... To powinna być zaakceptowana odpowiedź.
Seth Flowers

To jest najlepsze ... Zauważ również, że nowa składnia to fdescribei fit- „f” oznacza „skupiony”. Zobacz także jasmine.github.io/2.1/focused_specs.html
Ezekiel Victor,

25

Można to zrobić na kilka sposobów.

Jest: Jasmine's Focused Specs (2.2): http://jasmine.github.io/2.2/focused_specs.html

Skoncentrowanie specyfikacji sprawi, że będą jedynymi, które działają. Każda specyfikacja zadeklarowana jako fit jest skupiona.

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

Jednak nie podoba mi się pomysł edycji moich testów (fit i fdescribe), aby uruchamiać je selektywnie. Wolę używać narzędzia uruchamiającego testy, takiego jak karma, który może odfiltrowywać testy za pomocą wyrażenia regularnego.

Oto przykład użycia grunt .

$ grunt karma:dev watch --grep=mypattern

Jeśli używasz gulp (który jest moim ulubionym narzędziem do uruchamiania zadań), możesz przekazywać argumenty do gulp-karmy za pomocą yargów i dopasowywać wzorce, ustawiając konfigurację karmy.

Coś jak to:

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

Zobacz moje streszczenie: https://gist.github.com/rimian/0f9b88266a0f63696f21

Więc teraz mogę uruchomić pojedynczą specyfikację, używając opisu:

Moje lokalne uruchomienie testowe: (Wykonano 1 z 14 (pominięto 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

Zobacz także: https://github.com/karma-runner/karma-jasmine


Podoba mi się twój pomysł wykorzystania gruntów do selektywnego uruchamiania testów, ale chciałbym, żeby konfiguracja łyka i karmy była bardziej elastyczna, łatwiejsza do rozszerzenia i łatwiejsza do zrozumienia w tym zakresie.
nocarrier

8

Możesz utworzyć wszystkie swoje specyfikacje z góry, ale wyłącz je za pomocą xdescribei, xitdopóki nie będziesz gotowy do ich przetestowania.

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

W przypadku samodzielnego Jasmine (2.0.0) na spec_runner.htlm mogłem kliknąć konkretną specyfikację i skupić się na tej specyfikacji. Powinienem był zauważyć tę funkcję wcześniej.


1

Nie jest to dokładnie to, o co prosiłeś, ale dodanie iitprzetestuje tylko tę konkretną specyfikację i zignoruje wszystkie inne w pliku, ddescribedziała w ten sam sposób. Możesz więc skupić się na konkretnej specyfikacji za pomocą iitlubddescribe


1

To najbardziej uproszczona odpowiedź z praktycznym przykładem. Nawet w fdescribe można uruchomić kilka bloków za jej pomocą. f oznacza skupienie.

Również w bloku none fdescribe, który jest właśnie opisany, możesz wybrać tylko określone bloki it, oznaczając je jako dopasowane.

Uruchom poniższy kod i obserwuj dziennik konsoli, przeczytaj również komentarze w kodzie. Przeczytaj artykuł tego autora, który też pomaga. 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");
        }); 
      });
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.