Я пытаюсь протестировать компонент, который показывает или скрывает кнопку на основе данных текущего пользователя. Я получаю данные пользователя из метода на сервисе. Компонент использует метод получения для вызова метода службы.
В компоненте:
get me() {
return this.sessionService.getMe()
}
В html компонента:
<a id="profile-button" *ngIf="me.loggedIn" routerLink="profile">Profile</a>
Мне нужно проверить, отображается ли кнопка, когда я вошел в систему, и что она не отображается, когда я не вошел в систему. Я отключаю службу сеанса следующим образом:
В файле спецификации компонента:
let sessionServiceStub = {
currentUser: {
loggedIn: false
}
getMe: function () {
return this.currentUser
}
}
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: ['RouterTestingModule'],
declarations: ['MyComponent'],
providers: [{provide: SessionService, useValue: sessionServiceStub}],
}).compileComponents()
}))
beforeEach(() => {
sessionServiceStub.currentUser = {
loggedIn = false
}
fixture = TestBed.createComponent(MyComponent);
component = fixture.componentInstance;
fixture.detectChanges();
})
В начале каждого теста я устанавливаю свойство loggedOn в заглушке сервиса на true или false, затем вызываю detectChanges()
, но HTML-код не обновляется должным образом. Связано ли это с геттером, и если да, как я могу заставить представление получить новое значение из sessionService?
В файле спецификации компонента:
it('shows the button when a user is logged in', () => {
sessionServiceStub.currentUser.loggedIn = true
fixture.detectChanges()
de = fixture.debugElement.query(By.css('#profile-button'))
el: HTMLAnchorElement = de.nativeElement // TypeError: Cannot read property 'nativeElement' of null
// ...
})