【问题标题】:mat-slide-toggle unit test case is showing errormat-slide-toggle 单元测试用例显示错误
【发布时间】: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

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

【问题讨论】:

    标签: angular typescript karma-jasmine angular-test angular-unit-test


    【解决方案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。
    猜你喜欢
    • 2018-08-05
    • 2018-08-08
    • 2017-08-05
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 2018-11-16
    • 2019-03-23
    • 2018-07-18
    相关资源
    最近更新 更多