2016-07-15 24 views
12

Tôi đơn vị thử nghiệm một phần và đây là những gì tôi có:Chờ cho ngOnInit để kết thúc trong Jasmine Angular2

describe('Component: nav',() => { 

    beforeEach(() => addProviders([ 
    provide(UserService, {useClass: MockUserService}), 
    NavComponent 
    ])); 

    it('should have a property \'firstName\' with the value \'Crazypug\'', 
    async(inject([NavComponent], (component) => { 
     component.ngOnInit(); 
     expect(component.firstName).toEqual('Crazypug') 
    })) 
); 

}); 

Đây là chức năng ngOnInit:

ngOnInit() { 
    this.userService.getFirstNameCall().subscribe(
     data => {this.firstName = data.firstname; }); 
} 

Khi tôi chạy thử nghiệm tôi nhận được:

Dự kiến ​​không xác định đến bình đẳng 'Crazypug'

Làm thế nào tôi có thể để Jasmine đợi chức năng ngOnInit kết thúc? Tôi tìm thấy một số giải pháp về SO nhưng từ một thời gian dài trước đây (trong điều khoản angular2 của thời gian). Chúng rất phức tạp hoặc lỗi thời.

Trả lời

12

Bạn nên thay thế async chức năng cho fakeAsync

import {..., tick, fakeAsync} from '@angular/core/testing'; 
... 
fakeAsync(inject([NavComponent], (component) => { 
    component.ngOnInit(); 
    tick(); 
    expect(component.firstName).toEqual('Crazypug') 
})) 
+0

ngOnInit tôi gọi một http.get (thông qua phương pháp dịch vụ) và khi trở về của nó, thiết lập dữ liệu với giá trị nhận được. Nếu tôi bọc mã thử nghiệm trong một setTimeout, nó thành công nhưng phương pháp đánh dấu dường như không hoạt động (ngay cả khi được cung cấp một timeout giống như giá trị setTimeout .. Không chắc chắn lý do tại sao – Nitin

Các vấn đề liên quan