Мне было поручено написать тесты для приложения для чата, разработанного на Angular. Ниже приведен фрагмент кода шаблона Angular, для которого я сейчас пишу тесты:
<div class="title-menu-container" fxLayoutAlign="center center">
<button id="save-title-button" mat-icon-button *ngIf="titleInputEdit; else settings">
<mat-icon class="secondary-text" (click)="saveTitle(titleInput.value)">check</mat-icon>
</button>
<ng-template #settings>
<button mat-icon-button [matMenuTriggerFor]="menu" [disabled]="!(isGroupConversation$ | async)">
<mat-icon class="secondary-text">settings</mat-icon>
</button>
</ng-template>
</div>
По сути, если булева переменная компонента 'titleInputEdit' имеет значение true, отображается кнопка сохранения заголовка, в противном случае отображается кнопка настроек. Вот тестовый пример, который вызывает проблемы:
it('save title button should be present', () => {
component.titleInputEdit = true;
fixture.detectChanges();
expect(fixture.nativeElement.querySelector('#save-title-button')).not.toBe(null);
});
Я просто «высмеиваю» переменную компонента, вызываю .detectChanges () и проверяю наличие кнопки. Тем не менее, тест не пройден с «Ожидаемый ноль не будет нулевым».
С помощью различных вызовов console.log я подтвердил, что для component.titleInputEdit правильно установлено значение true, но fixture.nativeElement НЕ содержит правильную кнопку.
Некоторые вещи, которые я заметил:
Если я переместлю строку 'component.titleInputEdit = true' в мой beforeEach и удалю ее, и вызов функции visibleChanges () из моего теста будет пройден.
beforeEach(() => {
fixture = TestBed.createComponent(TestComponent);
component = fixture.componentInstance;
component.titleInputEdit = true
fixture.detectChanges();
debugElement = fixture.debugElement;
});
it('save title button should be present', () => {
expect(fixture.nativeElement.querySelector('#save-title-button')).not.toBe(null);
});
Если я удаляю вызов .detectChanges () из beforeEach () и оставляю его в тестовом примере, тест проходит.
Я относительно новичок в Angular, но я встречал людей с похожей проблемой. После того, как я попробовал кое-что из того, что было рекомендовано в этих постах, я все еще остаюсь, почесывая голову Еще более странным является то, что я написал тесты для других компонентов Angular, которые делают практически то же самое без проблем.
Пример, приведенный в документах Angular, также показывает нечто очень похожее:
it('should display a different test title', () => {
component.title = 'Test Title';
fixture.detectChanges();
expect(h1.textContent).toContain('Test Title');
});