Я попытался добавить больше тестов к моему образцу после того, как получил ответ на свой последний вопрос.
Макет savePost
работает хорошо, но я пытался проверить путь updatePost
, это не удалось.
PostFormComponent
включает в себя input
привязку и output
источник событий.
@Component({
selector: 'app-post-form',
templateUrl: './post-form.component.html',
styleUrls: ['./post-form.component.css']
})
export class PostFormComponent implements OnInit, OnDestroy {
@Input() post: Post = { title: '', content: '' };
@Output() saved: EventEmitter<boolean> = new EventEmitter<boolean>();
sub: Subscription;
constructor(private postService: PostService) {}
submit() {
const _body = { title: this.post.title, content: this.post.content };
if (this.post.id) {
this.postService.updatePost(this.post.id, _body).subscribe(
data => {
this.saved.emit(true);
},
error => {
this.saved.emit(false);
}
);
} else {
this.postService.savePost(_body).subscribe(
data => {
this.saved.emit(true);
},
error => {
this.saved.emit(false);
}
);
}
}
ngOnInit() {
console.log('calling ngOnInit::PostFormComponent...');
}
ngOnDestroy() {
console.log('calling ngOnDestroy::PostFormComponent...');
if (this.sub) {
this.sub.unsubscribe();
}
}
}
И мой тест:
it('should raise `saved` event when the form is submitted (triggerEventHandler):update', fakeAsync(() => {
const formData: Post = {
id: '1',
title: 'Test title',
content: 'Test content'
};
// trigger initial data binding
component.post = formData;
let saved = false;
// Make the spy return a synchronous Observable with the test data
updatePostSpy = postServiceSpy.updatePost
.withArgs('1', formData)
.and.returnValue(of({}));
component.saved.subscribe((data: boolean) => (saved = data));
// componentDe.triggerEventHandler('submit', null);
const formElement = componentDe.query(By.css('form#form'));
formElement.triggerEventHandler('submit', null);
// component.submit();
tick();
fixture.detectChanges();
expect(saved).toBeTruthy();
expect(updatePostSpy.calls.count()).toBe(1, 'updatePost called');
}));
Кажется, значение saved
назначено не так, как ожидалось.Когда я закомментировал expect(saved).toBeTruthy()
, expect(updatePostSpy.calls.count()).toBe(1, 'updatePost called')
работает, это значит, что updatePost
шпион вызван, но почему component.saved.subscribe((data: boolean) => (saved = data));
не работает как экспортированный?