2017-02-04 11 views
5

Podoba mi się możliwość przekazania wykonanego wywołania zwrotnego podczas dokonywania unittest, aby dokładnie kontrolować, kiedy unittest jest uważany za zrobiony. Czy ktoś może wyjaśnić, jak można to połączyć z zastrzykiem zależności przy użyciu Angular 2?Jak połączyć wykonane wywołanie zwrotne z wtryskiem kątowym 2 unittest

Nieco tła:

Normalny unittest z funkcją zwrotną wygląda następująco:

unittest generowane przez kątowe 2 ramy stosuje wstrzyknięcie i wygląda następująco:

it('should be defined', inject([TxparserService], (service: TxparserService) => { 
    expect(service).toBeTruthy(); 
    })); 

Chcę używać zarówno funkcji zwrotnej, jak i wtrysku zależności. Jak to wygląda?

Odpowiedz

6

Nie jestem pewien, czy potrafisz. Osobiście jednak przestałem używać tego stylu wtrysku z kilku powodów: 1. Jest dość gadatliwy i 2. Powtarzaj go dla każdego przypadku testowego. Kilka innych opcji są:

  • Użyj beforeEach

    let service: TxparserService; 
    
    beforeEach(() => { // configure }); 
    
    beforeEach(inject([TxperserverService], (svc: TxparserService) => { 
        service = svc; 
    })); 
    
  • Dla mnie powyżej beforeEach, wciąż łamie moje pierwsze obawy bycia gadatliwy, więc po prostu zrobić to w ten sposób teraz

    let service: TxparserService; 
    
    beforeEach(() => { 
        TestBed.configureTestingModule({ 
         providers: [ TxparserService ] 
        }); 
    
        service = TestBed.get(TxparserService); 
    }); 
    
+0

Thx za odpowiedź. To może dla mnie zadziałać, więc na razie oznaczę to jako odpowiedź. –

3

udało mi się z powodzeniem połączyć z fakeAsync wstrzyknąć. Tak to będzie wyglądać jak następuje:

it('should be defined', fakeAsync(inject([TxparserService], (service: TxparserService) => { 
    expect(service).toBeTruthy(); 
}))); 

Można łączyć je następnie z funkcją tick() opisaną w https://angular.io/guide/testing#the-fakeasync-function

+2

Pracowałem dla mnie w ten sam sposób, używając "async". –

6

Jeśli trzeba połączyć done -Style testu transmisji asynchronicznej z wtryskiem można po prostu wykonaj następujące czynności:

it('should work', (done) => inject([SomeService], (someService: SomeService) => 
{ 
    expect(true).toEqual(true); 
    done(); 
})()); 

Upewnij się, że od razu wywołuje się funkcję zwróconą przez inject.

PS: Czasami nie async ani fakeAsync prace i tak trzeba go mieć done w modzie starej szkoły ...

PPS: Jeśli ktoś jest zainteresowany, jak przezwyciężyć problemy z operacji zależnych od czasu obserwowalnych z jasmine-marbles spójrz na ten krótki przykład: marble-scheduler-injector.ts

+0

Może to być związane z: https://github.com/angular/angular/issues/10127 – vivri

+0

@vivri dokładnie, ale ostatnio przerzuciłem się na [jaśminowe kulki] (https://www.npmjs.com/package/ jasmine-marbles), a teraz nie potrzebuję żadnego asynu (przynajmniej dla Observables) - to po prostu działa całkowicie zsynchronizowane! PS: aby to zadziałało, musisz wstrzyknąć TestScheduler z jaśminowych kulek w zależne od czasu obserwowalne operacje. –

Powiązane problemy