mat-slide-toggle 单元测试用例显示错误

Posted

技术标签:

【中文标题】mat-slide-toggle 单元测试用例显示错误【英文标题】:mat-slide-toggle unit test case is showing error 【发布时间】:2021-11-27 15:25:49 【问题描述】:

我想为 mat slide toggle 编写测试用例。

Test case

    it('should call change method on slide change', async () => 
        const nativeElement = fixture.nativeElement;
        const slider = nativeElement.querySelector('.slider');
        slider.dispatchEvent(new Event('change'));
        expect(component.toggleStatus).toHaveBeenCalled();
    
      );

我的组件.html

 <ng-container matColumnDef="active">
        <th mat-header-cell *matHeaderCellDef>Status</th>
        <td mat-cell *matCellDef="let row" (click)="isAction=true">
            <mat-slide-toggle class="slider" color="primary" [checked]="row.status" #toggle
                (change)="toggleStatus($event,row,toggle)">
            </mat-slide-toggle>
        </td>
    </ng-container>

Component.ts

 public toggleStatus(event: MatSlideToggleChange, service: ServiceModel, toggle: MatSlideToggle) 
        if (event.checked) 
          this.actionActivate(service, toggle);
         else 
          this.actionDeactivate(service, toggle);
        
      

执行此测试用例时的错误是 enter image description here

谁能帮我纠正这个测试用例

【问题讨论】:

【参考方案1】:

对于这种情况,我会在DebugElement 上使用triggerEventHandler

it('should call change method on slide change', async () => 
        const slider = fixture.debugElement.query(By.css('.slider'));
        // Edit
        console.log(fixture.nativeElement);
        debugger;
        // make sure the slider is truthy
        expect(slider).toBeTruthy();
        slider.triggerEventHandler('change', /* mock the event here */);
        expect(component.toggleStatus).toHaveBeenCalled();
      );

如果expect(slider).toBeTruthy() 失败,则表示该元素未在 DOM 中绘制。

确保您具备以下条件:

import MatSlideToggleModule from '@angular/material/slide-toggle';
import MatTableModule from '@angular/material/table';

TestBed.configureTestingModule(
  imports: [MatTableModule, MatSlideToggleModule], // import is required so Angular knows how to paint
  // the elements.
);

【讨论】:

当我给出你提到的测试用例时,测试仍然失败。常量滑块 = fixture.debugElement.query(By.css('.slider'));它显示空值。如何纠正它。 --@AliF50 使用 console.log 和调试器查看我的编辑。如果在 chrome 打开并运行测试时按 F12,它应该暂停。然后,您可以检查 DOM 以查看发生了什么。我在想 .slider 元素当时不存在于 DOM 中。 你是对的。 DOM 中不存在元素。 。我们如何测试滑块切换? - AliF50 我不确定。我在想可能是 ngIf 阻止了元素的显示,或者您在导入数组中缺少一个 imprtt。

以上是关于mat-slide-toggle 单元测试用例显示错误的主要内容,如果未能解决你的问题,请参考以下文章

四则运算2单元测试

单元测试框架

编写单元测试用例说明书的依据是啥

gtest测试用例可以走分支,分支覆盖不显示原因

Maven 进行单元测试用例的使用,加载的资源是哪里的

Argparse 单元测试:禁止显示帮助消息