首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单元测试垫-带有Karma-Jasmine的菜单

单元测试垫-带有Karma-Jasmine的菜单
EN

Stack Overflow用户
提问于 2020-04-28 22:32:16
回答 3查看 2K关注 0票数 4

我有一个垫菜单,其中的内容可能不同的用户。我尝试编写单元测试,但据我所见,jasmine看不到CDK div,所以我无法抓取菜单项。

我的模板:

代码语言:javascript
复制
<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>

单元测试:

代码语言:javascript
复制
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();

});

我试过了

代码语言:javascript
复制
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菜单内容,你有什么想法吗?

EN

回答 3

Stack Overflow用户

发布于 2021-02-08 04:38:42

MatMenuHarness是测试垫子菜单的合适方法,但它有一个微小的、非直观的细节。给定:

代码语言:javascript
复制
<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。

代码语言:javascript
复制
addCounterpartyMenu = await loader.getHarness<MatMenuHarness>(
  MatMenuHarness.with({
    selector: `[data-testid="add-counterparty"]`,
  }),
);

票数 4
EN

Stack Overflow用户

发布于 2021-02-07 06:46:31

我觉得你应该用MatMenuHarness试试。

https://material.angular.io/components/menu/api#MatMenuHarness

代码语言:javascript
复制
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);
  });
票数 1
EN

Stack Overflow用户

发布于 2020-04-29 21:46:00

我认为问题是在同一个时钟中进行所有的交互,因此,DOM直到下一个时钟才会被更新。

为了处理这个问题,你可以使用Angular的fakeAysnctick

我认为我们可以像这样用fakeAsync重写你的测试:

代码语言:javascript
复制
    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();
      }));

我认为它应该和它一起工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61482746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档