spyObj withArgs mock не работает должным образом - PullRequest
0 голосов
/ 09 декабря 2018

Я попытался добавить больше тестов к моему образцу после того, как получил ответ на свой последний вопрос.

Макет 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)); не работает как экспортированный?

...