Tôi muốn thử nghiệm một phương thức bên trong thành phần Angular 2 được đăng ký với một quan sát được trả về từ một phương thức trong một dịch vụ. Dưới đây là mã cho phương pháp dịch vụ tóm tắt:Thử nghiệm một phương pháp được đăng ký với một quan sát - Angular 2
public create(user: User): Observable<any> {
return this.http.post(this._api.create,
JSON.stringify(user), {
headers: this.apiConfig.getApiHeaders()
}).map((res: Response) => res.json());
}
Thật dễ dàng để đơn vị kiểm tra phương pháp này vì nó trả về một quan sát để tôi có thể đăng ký nó. Nhưng tôi muốn thử nghiệm phương pháp này trong các thành phần đó đã được đăng ký này:
public onSubmit(user: User): void {
this._authentication.create(user).subscribe((token) => {
localStorage.setItem('token', token);
this.router.navigate(['/Home']);
});
}
Heres spec của tôi cho đến nay nhưng khi tôi cố gắng spyOn các localStorage.setItem nó trở lại như không được gọi. Sự hiểu biết của tôi là nó có thể kiểm tra xem nó đã được gọi trước khi nó thực sự được gọi.
it('Should login a user and on success store a token in localStorage',
injectAsync([TestComponentBuilder], (tcb) => {
return tcb.createAsync(Login).then((fixture) => {
let instance = fixture.debugElement.componentInstance;
localStorage.clear();
spyOn(localStorage, 'setItem');
instance.onSubmit({userId: '[email protected]', password: 'password', siteName: 'sample'});
expect(localStorage.setItem).toHaveBeenCalled();
});
})
);
Tôi tự hỏi liệu mình có cần thử phương thức this._authentication.create để trả về một phương thức mới có thể quan sát được bằng phản hồi giả trong đó không? Sau khi nghiên cứu thêm một vài bài báo chỉ ra rằng tôi cần phải giả lập dịch vụ và trả về một Observable.of() chạy đồng bộ để giải quyết vấn đề, sao chép mã dưới đây một cách không đúng. Điều này tuy nhiên vẫn không hoạt động, tôi đã làm việc này hầu hết trong ngày, tôi không cảm thấy điều này nên được khó khăn, bất kỳ sự giúp đỡ đánh giá cao.
class MockAuthentication extends Authentication {
public create(user: Object): Observable<any> {
return Observable.of({'test': 'test'});
}
}
Nó cảm thấy như việc kiểm tra sẽ xảy ra trước khi họ bị gọi là vì đăng ký nhưng tôi mới để quan sát. Ngoài ra, chúng tôi sử dụng để chỉ sử dụng spyOn (localStorage, 'setItem') trong Angular 1 nhưng tôi đang gặp khó khăn trong việc tìm ra cách làm tương tự với Angular 2. – HomeBrew
Tệ của tôi, có vẻ như bạn vẫn sử dụng spyOn, vấn đề của tôi là tôi không thể tìm ra nơi bạn cần phải nhập khẩu 'spyOn' từ nhưng có vẻ như bạn chỉ có nó. Nhưng có vẻ như tuyên bố của tôi về việc kiểm tra xảy ra trước khi vẫn chạy đúng. Tôi đã cập nhật câu hỏi của mình để bao gồm thông số. – HomeBrew