angular - 注入服务更改时,HTML 未在角度测试中更新
问题描述
我正在尝试测试一个基于当前用户详细信息显示或隐藏按钮的组件。我从服务上的方法获取用户详细信息。该组件使用 getter 来调用服务方法。
在组件中:
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 没有按预期更新。这与getter有关吗?如果是这样,我如何强制视图从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
// ...
})
解决方案
从 beforeEach 方法中删除 fixture.detectChanges()。
beforeEach(() => {
sessionServiceStub.currentUser = {
loggedIn = false
}
fixture = TestBed.createComponent(MyComponent);
component = fixture.componentInstance;
})
它应该可以正常工作。
推荐阅读
- r - 如何在 R 中对日期进行子集化和操作?
- python - 工作培训分配不明确,寻求一些外部指导
- c# - IronPython 和 Revit API - 如何在列表框中显示项目属性(属性名称)?
- python-3.x - 如何在数据帧的每一行中找到最长的连续 1 序列的长度?
- r - 在R中将变量分配给带有字符串的变量
- javascript - 解析对象内的 JSON 对象
- rust - 不能借用可变的,因为它在 `&` 引用后面
- timestamp - Microsoft BotFramework Transcript 记录时间戳格式
- python - 使用 LIRC 为 Raspberry PI (RPi) 设置 IR 远程控制
- azure-devops - SSH 文件复制 - 不允许使用公钥