用Karma-Jasmine进行单元测试的mat-菜单。

问题描述 投票:0回答:1

我有一个mat-menu,其中的内容可能会因用户不同而不同。我试图写单元测试,但从我所看到的情况来看,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-menu的内容吗?

谢谢

angular angular-material jasmine angular-cdk
1个回答
0
投票

我认为问题是你在同一个时钟交互中做了所有的事情,因此,DOM不会被更新,直到下一个时钟。

为了处理这个问题,你可以使用 伪造的Aysnc勾选 Angular的。

我想我们可以像这样用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();
      }));

我想应该可以用它来测试

© www.soinside.com 2019 - 2024. All rights reserved.