我正在尝试点击
mat-menu-item
按钮访问广告。我正在使用 MatMenuItemHarness
访问该元素,但测试失败并显示消息:
错误:无法找到与以下查询之一匹配的元素: (MatMenuItemHarness 与主机元素匹配选择器:“.mat-mdc-menu-item”)
这是相关的html:
<mat-menu #menu="matMenu" class="user-menu">
<button
mat-menu-item
class="edit-profile-button"
aria-label="Edit profile button"
[routerLink]="['../edit-profile']"
>Edit Profile
</button>
<button
mat-menu-item
aria-label="Logout button"
class="logout-button"
(click)="logout()"
>Logout
</button>
</mat-menu>
这是测试:
describe('logout button', () => {
it('should emit the logoutUser event when clicked', async () => {
spyOn(component.logoutUser, 'emit');
component.loggedOnUser$ = of(new User());
const userMenu = await loader.getHarness(MatMenuHarness);
await userMenu.open();
const btn = await loader.getHarness(MatMenuItemHarness);
await btn.click();
expect(component.logoutUser.emit).toHaveBeenCalled();
});
});
我设置了另一个测试,确认运行测试时菜单项是否存在:
describe('logout button', () => {
it('should emit the logoutUser event when clicked', async () => {
component.loggedOnUser$ = of(new User());
const userMenu = await loader.getHarness(MatMenuHarness);
await userMenu.open();
const items = await userMenu.getItems();
expect(items.length).toBe(2) // THIS PASSES
expect((await loader.getAllHarnesses(MatMenuItemHarness)).length).toBe(2); //THIS FAILS
});
});
这是测试模块设置:
beforeEach(() => {
TestBed.configureTestingModule({
imports: [
ToolbarComponent,
RouterTestingModule,
MatMenuModule,
MatButtonModule,
BrowserAnimationsModule
]
})
fixture = TestBed.createComponent(ToolbarComponent);
component = fixture.componentInstance;
fixture.detectChanges();
loader = TestbedHarnessEnvironment.loader(fixture);
});
有人知道为什么
MatMenuItemHarness
在这种情况下不起作用吗?
我也面临同样的问题。因此,我深入研究代码,我突然意识到菜单项基本上存在是一个面板。 这就是为什么你无法通过调用 loader.getAllHarnesses(MatMenuItemHarness) 来获取线束的原因。