2016-12-09 10 views
15

Czytałem oficjalną dokumentację Angular2 do testowania jednostkowego (https://angular.io/docs/ts/latest/guide/testing.html), ale mam problem z ustawieniem wartości pola wejściowego komponentu, aby odzwierciedlić ją we właściwości komponentu (powiązanej przez ngModel). Ekran działa dobrze w przeglądarce, ale w teście jednostki nie mogę ustawić wartości pól.Wartość wejściowa testu jednostkowego Angular2

Używam poniżej kodu. "urządzenie" zostało poprawnie zainicjowane, ponieważ inne testy działają poprawnie. "comp" jest instancją mojego komponentu, a pole wejściowe jest przypisane do "user.username" przez ngModel.

it('should update model...', async(() => { 
    let field: HTMLInputElement = fixture.debugElement.query(By.css('#user')).nativeElement; 
    field.value = 'someValue' 
    field.dispatchEvent(new Event('input')); 
    fixture.detectChanges(); 

    expect(field.textContent).toBe('someValue'); 
    expect(comp.user.username).toBe('someValue'); 
    })); 

Moja wersja Angular2: "@angular/core": "2.0.0"

Odpowiedz

24

Wejścia nie mają textContent, tylko wartość. Tak więc expect(field.textContent).toBe('someValue'); jest bezużyteczny. Prawdopodobnie to się nie udaje. Drugie oczekiwanie powinno jednak minąć. Oto pełny test.

@Component({ 
    template: `<input type="text" [(ngModel)]="user.username"/>` 
}) 
class TestComponent { 
    user = { username: 'peeskillet' }; 
} 

describe('component: TestComponent',() => { 
    beforeEach(() => { 
    TestBed.configureTestingModule({ 
     imports: [FormsModule], 
     declarations: [ TestComponent ] 
    }); 
    }); 

    it('should be ok', async(() => { 
    let fixture = TestBed.createComponent(TestComponent); 
    fixture.detectChanges(); 
    fixture.whenStable().then(() => { 
     let input = fixture.debugElement.query(By.css('input')); 
     let el = input.nativeElement; 

     expect(el.value).toBe('peeskillet'); 

     el.value = 'someValue'; 
     el.dispatchEvent(new Event('input')); 

     expect(fixture.componentInstance.user.username).toBe('someValue'); 
    }); 
    })); 
}); 
+0

kopalni nie było pracować nawet bez pierwszy 'oczekiwać' rzeczywistości. Ale twoja działa na szczęście z wdzięcznością, nie mam pojęcia dlaczego tak, zakładam ją, ponieważ jest po rozwiązaniu whenStable()? Dzięki za pomoc. – Zyga

+1

Jeśli konfigurowałeś komponent w przedtem, tworząc asynchronię beforeEach, wywołanie fixture.detectChanges po utworzeniu komponentu prawdopodobnie zadziałałoby z powyższym kodem bez potrzeby wywoływania funkcji ifStable. Jeśli zrobiłeś to z powyższym kodem, możesz pozbyć się wszystkiego poza tym, co jest w tym wywołaniu. Myślę, że to też zadziała. Asynchronizacja beforeEach powinna w zasadzie zrobić to samo, co zrobiłaby funkcja WhenStable, czyli czekać na zakończenie zadań asynchronicznych przed wyjściem z beforeEach –

2

Wystarczy dodać

fixture.detectChanges(); 

fixture.whenStable().then(() => { 
    // here your expectation 
}) 
0

Użyj swojej oczekiwać/dochodzić wewnątrz funkcji whenStable.then tak:

component.label = 'blah'; 
    fixture.detectChanges(); 

    fixture.whenStable().then(() => { 
      expect(component.label).toBe('blah'); 
     } 
Powiązane problemy