ApiServiceSpy
export class ApiServiceSpy {
get() {
return Observable.of(null);
}
}
UserService
export class UserService {
constructor(private apiService: ApiService) {
this.initUser();
}
initUser() {
this.fetchUser().subscribe(user => console.log(user.name));
}
fetchUser(): {name: string} {
return this.apiService.get('user');
}
}
UserService.spec
export class UserServiceSpec {
...
{
providers: [
{provide: ApiService, useClass: ApiServiceSpy}
]
}
...
it('should be created', () => {
expect(service).toBeTruthy();
});
}
Хорошо, теперь тест «должен быть создан» завершается неудачно, потому что конструктор сервиса вызывает метод initUser
, который использует fetchUser
и пытается попасть в user.name
, но apiService.get возвращает null
, поэтому мы можем ' читать name
из ноль - понятно.
Так что я пытаюсь шпионить за fetchUser method
UserService.spec
export class UserServiceSpec {
...
{
providers: [
{provide: ApiService, useClass: ApiServiceSpy}
]
}
...
beforeEach(() => {
spyOn(service, 'fetchUser').and.returnValue(Observable.of({name: 'Daniel'});
});
it('should be created', () => {
expect(service).toBeTruthy();
});
}
К сожалению, результат тот же. Как это возможно? Я только что заметил весь метод fetchUser
, но спецификация все еще рассматривает шпиона apiService.get как более важную.