Uruchomienie pojedynczego pliku testowego

161

Czy istnieje sposób uruchomienia ng testpojedynczego pliku zamiast całego zestawu testów? Idealnie chciałbym uzyskać możliwie najszybszą pętlę sprzężenia zwrotnego, kiedy edytuję plik, ale karmawykonuje cały zestaw przy każdym zapisie, co jest nieco powolne, gdy tworzysz wystarczająco duży zestaw testów.


To różni się od Jak wykonać tylko jedną specyfikację testową z angular-cli tym, że to pytanie dotyczy uruchomienia indywidualnej specyfikacji. Chodzi o uruchomienie pojedynczego pliku. Rozwiązanie obejmuje tę samą specyfikację Jasmine, ale charakter pytania jest nieco inny.

Elliot Larson
źródło
Możesz znaleźć odpowiedź tutaj: stackoverflow.com/questions/40683673/…
Sahil Shikalgar
Możesz znaleźć odpowiedź tutaj: stackoverflow.com/questions/40683673/…
Sahil Shikalgar

Odpowiedzi:

285

Odkryłem, że Jasmine pozwala na przedrostek describei itmetody z f(dla fokusu): fdescribei fit. Jeśli użyjesz któregokolwiek z nich, Karma przeprowadzi tylko odpowiednie testy. Aby skupić się na bieżącym pliku, możesz po prostu przejść na najwyższy poziom describei zmienić go na fdescribe. Jeśli używasz Jasmine przed wersją 2.1, kluczowe słowa kluczowe to: iiti ddescribe.

Ten przykładowy kod uruchamia tylko pierwszy test:

// Jasmine versions >/=2.1 use 'fdescribe'; versions <2.1 use 'ddescribe'
fdescribe('MySpec1', function () {
    it('should do something', function () {
        // ...
    });
});

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

Oto dokumentacja Jasmine dotycząca specyfikacji Focusing, a tutaj powiązany artykuł SO, który zawiera dodatkowe przemyślane rozwiązania.

Elliot Larson
źródło
12
legendarna odpowiedź
danday74
3
Nie mogę uwierzyć, że tak ważna funkcjonalność nie jest bardziej oczywista i prosta.
Ash,
11
działa, ale nie jest idealny, ponieważ musisz zmienić kod źródłowy i możesz w końcu sprawdzić zmodyfikowany kod w kontroli źródła.
Marco Altieri
5
Jeśli to możliwe, dodaj linki do oficjalnej dokumentacji
jgpATs2w
Szukałem tego, Niesamowite
Carlos E
36

W dzisiejszych czasach można to osiągnąć za pomocą includeopcji. https://angular.io/cli/test#options

Jest to dopasowanie globalne, więc na przykład:

ng test --include='**/someFolder/*.spec.ts'

Nie mogę go znaleźć w informacjach o wydaniu 8.1.0 , ale @Swoox wspomina poniżej, że jest to funkcja po wersji cli 8.1.0. Dzięki, że to rozgryzłeś.

Levi
źródło
1
Wygląda na to, że jest to ostatnia aktualizacja. Może zechcesz dołączyć wersję, która jest potrzebna. Wymagany jest interfejs CLI 8.1.
Swoox
Wydaje się, że został usunięty w wersji 9.1 :(
rmcsharry
3
Właśnie przetestowałem to w CLI v9.1.0 i działa idealnie.
Sajjan Singh
1
Działa również w CLI v10.0.4
David
29

Warto wspomnieć, że możesz wyłączyć dany test bez komentowania przez xdescribeixit

xdescribe('Hello world', () => { 
  xit('says hello', () => { 
    expect(helloWorld())
        .toEqual('Hello world!');
  });
});

I jak ktoś już powiedział, jeśli chcesz skupić się na jakimś teście, to fdescribeifit

fdescribe('Hello world', () => { 
  fit('says hello', () => { 
    expect(helloWorld())
        .toEqual('Hello world!');
  });
});
DiPix
źródło
13

Odkryłem, że ng testma dodatkową opcję, --includektórej możesz użyć, aby móc uruchomić test dla pojedynczego pliku lub dla określonego katalogu lub dla kilku plików:

// one file
npm run test -- --include src/app/components/component/component-name.component.spec.ts

// directory or bunch of files
npm run test -- --include src/app/components

ng cli docs

var-bin
źródło
Angular 9 - wydaje się, że został usunięty
rmcsharry
1
Nie, jest nadal dostępny w NG 9.
tephyr
9

Możesz przejść do src/test.tsnastępującego wiersza i zmienić go:

const context = require.context('./', true, /\.spec\.ts$/);

do

const context = require.context('./', true, /**yourcomponent.component**\.spec\.ts$/);

wprowadź opis obrazu tutaj

Raghav
źródło
1
Ściśle mówiąc, brzmi to jak najbardziej poprawna odpowiedź, chociaż większość pytań dotyczących tego, jak to zrobić, ma problem rozwiązany za pomocą dopasowania i fdescribe. W Karmie jest problem z gitem, aby łatwiej to osiągnąć: github.com/karma-runner/karma/issues/1507 . Idealnie, choć nie tylko, moglibyśmy skonfigurować Karmę, abyśmy mogli wprowadzić zmiany w jednym teście, a następnie po prostu kliknąć go w przeglądarce, aby ponownie uruchomić go z aktualizacją.
pumpkinthehead
4

Korzystanie z ng test --main file.spec.ts

Niraj
źródło
3

W Angular 9 miałem szczęście do następujących rzeczy:

Jeśli chcesz przetestować konkretny plik:

ng test --test-file=path/to/your/file.component.spec.ts

Jeśli chcesz przetestować tylko to, co zmieniło się od ostatniego zatwierdzenia (używając git lub innej kontroli wersji)

ng test --only-changed

Jeśli masz wiele projektów w swoim projekcie Angular i / lub korzystasz z NX, możesz określić projekt Angular do przetestowania:

ng test project-name


Możesz także użyć

ng test --testNamePattern componentname

na coś takiego path/to/your/component/componentname.spec.ts. Spowoduje to przeskanowanie każdego pliku w każdym projekcie i jest wolniejsze.

Joel Kesler
źródło
1

Musisz iść src/test.tsi możesz zmienić następujący kod numeru linii 18:

//Then we find all the tests.
const context = require.context('./', true, /\.spec\.ts$/);

do

//Then we find all the tests.
const context = require.context('./', true, /testing.component\.spec\.ts$/);

wprowadź opis obrazu tutaj

Priti jha
źródło
-4

Działa, jeśli określisz plik specyfikacji jako parametr.

Na przykład:

ng test foo.spec.ts

Mam nadzieję że to pomoże.

gustavomcastro
źródło
4
Czy możesz określić, której wersji używasz? Nie działa z 1.7.x
FrEaKmAn
4
U mnie też nie zadziałało. Ale zmodyfikowałem go tak, aby działał z opcją --main przed ścieżką do pliku specyfikacji. Użyłem ścieżki absolutnej z ukośnikami do przodu. Nie próbowałem względnej ścieżki. Korzystanie z Angular 6. Nie jestem pewien, czy to najlepsze rozwiązanie, ale wydaje mi się, że działa.
user2367418