我有一个垫菜单,其中的内容可能不同的用户。我尝试编写单元测试,但据我所见,jasmine看不到CDK div,所以我无法抓取菜单项。
我的模板:
<button id="account" mat-icon-button [matMenuTriggerFor]="menu" aria-label="Profile">
<mat-icon>person</mat-icon>
</button>
<mat-menu #menu="matMenu">
<button mat-menu-item *ngxPermissionsOnly="PERMISSION.USER_LIST" id="user-list" (click)="usersList()">
<mat-icon>recent_actors</mat-icon>
</button>
<button mat-menu-item *ngxPermissionsOnly="PERMISSION.INFORMATIONS" id="informations" (click)="infoList()">
<mat-icon>info</mat-icon>
</button>
<button mat-menu-item id="logout" (click)="logout()">
<mat-icon>exit_to_app</mat-icon>
</button>
</mat-menu>单元测试:
let component: HeaderComponent;
let fixture: ComponentFixture < HeaderComponent > ;
const providers: any[] = headerProviders;
beforeEach(async (() => {
TestBed.configureTestingModule({
declarations: [
HeaderComponent,
NgxPermissionsRestrictStubDirective
],
providers: providers,
imports: [
BrowserAnimationsModule,
BrowserModule,
CommonModule,
CommonSogetrelModule,
FlexLayoutModule,
SharedMaterialModule,
RouterTestingModule.withRoutes([])
]
})
.compileComponents()
.then(() => {
fixture = TestBed.createComponent(HeaderComponent);
component = fixture.componentInstance;
});
}));
it('should not display elements which needs permissions', () => {
fixture.nativeElement.querySelector('#account').click();
fixture.detectChanges();
expect(logoutBtn).toBeTruthy('Le bouton Déconnexion doit être affiché');
expect(fixture.debugElement.nativeElement.querySelector('#user-list')).toBeFalsy();
});我试过了
console.info(fixture.nativeElement.parentNode);
const menu = fixture.nativeElement.parentNode.querySelector('.mat-menu-panel');
expect(menu).toBeTruthy();我在console.info中看到的是页面上没有CDK div,所以很明显找不到.mat-menu-panel。
关于如何测试mat菜单内容,你有什么想法吗?
发布于 2021-02-08 04:38:42
MatMenuHarness是测试垫子菜单的合适方法,但它有一个微小的、非直观的细节。给定:
<div class="view-contract__portal-header">
<h2>Counterparties</h2>
<button
mat-stroked-button
color="primary"
data-testid="add-counterparty"
[matMenuTriggerFor]="menu"
>
<mat-icon>add</mat-icon> Add counterparty
</button>
</div>
<mat-menu #menu="matMenu" data-testid="add-counterparty-menu">
<button
*ngFor="let role of roles"
mat-menu-item
[attr.data-testid]="'add-counterparty-' + role"
(click)="addCounterparty(role)"
>
{{ role }}
</button>
</mat-menu>
然后,应该通过查找应用了matMenuTriggerFor属性的元素而不是实际的mat-menu元素来实例化MatMenuHarness。
addCounterpartyMenu = await loader.getHarness<MatMenuHarness>(
MatMenuHarness.with({
selector: `[data-testid="add-counterparty"]`,
}),
);
发布于 2021-02-07 06:46:31
我觉得你应该用MatMenuHarness试试。
https://material.angular.io/components/menu/api#MatMenuHarness
it('should not display elements which needs permissions', async () => {
let loader: HarnessLoader = TestbedHarnessEnvironment.loader(fixture);
fixture.detectChanges();
let menu = await testHarness.loader.getHarness(MatMenuHarness);
let items = await menu.getItems();
expect(items.length).toBe(1);
});发布于 2020-04-29 21:46:00
我认为问题是在同一个时钟中进行所有的交互,因此,DOM直到下一个时钟才会被更新。
为了处理这个问题,你可以使用Angular的fakeAysnc和tick。
我认为我们可以像这样用fakeAsync重写你的测试:
it('should not display elements which needs permissions', fakeAsync(() => {
fixture.nativeElement.querySelector('#account').click();
tick();
fixture.detectChanges();
expect(logoutBtn).toBeTruthy('Le bouton Déconnexion doit être affiché');
expect(fixture.debugElement.nativeElement.querySelector('#user-list')).toBeFalsy();
}));我认为它应该和它一起工作。
https://stackoverflow.com/questions/61482746
复制相似问题