unit-testing - 单元测试Angular 5-期望对话框关闭

标签 unit-testing angular-material2 angular5

我有一个组件(这是一个MatDialog组件),其功能之一就是通过简单地调用“this.dialogRef.close(true);”来保存一些日期并在最后(对话框)关闭自身。到现在为止还挺好。
问题出在单元测试上。当我尝试测试此功能时,Karma会引发错误“TypeError:this.dialogRef.close不是函数”。我想它不能识别对话框中调用的关闭函数,因为我一定忘记了以某种方式在我的spec.ts文件中启动此dialogRef,但是考虑到事实并非如此,我不知道如何继续网络上有关在spec.ts中配置Material 2组件的大量 Material 。我的问题是:如何通过单元测试来获取此测试以识别dialogRef.close()函数。

下面是一些示例代码:
timeRangeDialogComponent.ts

import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';

export class TimeRangeDialogComponent implements OnInit, OnDestroy {

 constructor(public dialogRef: MatDialogRef<TimeRangeDialogComponent>,
           @Inject(MAT_DIALOG_DATA) public data: any) {
 }

 saveCustomTimeRange(): void {
   this.dialogRef.close(true);
 }
}

TimeRangeDialogComponent.spec.ts
beforeEach(async(() => {
  TestBed.configureTestingModule({
    declarations: [ TimeRangeDialogComponent ],
    imports: [ FormsModule, MaterialModule, MatDatepickerModule ],
    providers: [
      { provide: MatDialogRef, useValue: {} },
      { provide: MAT_DIALOG_DATA, useValue: [] } ]
  })
    .compileComponents();
}));

beforeEach(() => {
  fixture = TestBed.createComponent(TimeRangeDialogComponent);
  component = fixture.componentInstance;
  fixture.detectChanges();
});

it('should call the function to close the dialog', () => {
  component.saveCustomTimeRange();
  expect(component.dialogRef.close()).toHaveBeenCalled();
});

引发错误:TypeError:this.dialogRef.close不是函数

预先感谢您的帮助。

最佳答案

解决该问题的一种方法是提供具有close方法的对话框类的模拟,而不是仅在providers数组中提供一个空对象。就像是:

// mock object with close method
const dialogMock = {
    close: () => { }
};

beforeEach(async(() => {
  TestBed.configureTestingModule({
    declarations: [ TimeRangeDialogComponent ],
    imports: [ FormsModule, MaterialModule, MatDatepickerModule ],
    providers: [
      { provide: MatDialogRef, useValue: dialogMock },
      { provide: MAT_DIALOG_DATA, useValue: [] } ]
  })
    .compileComponents();
}));

这里的close方法实际上不执行任何操作,但是您可以检查是否至少已调用它。

关于unit-testing - 单元测试Angular 5-期望对话框关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48782791/

相关文章:

javascript - 如何使用 Jest 和 enzyme 测试异步数据获取 react 组件?

java - 如何对使用文件锁的 java 方法进行单元测试?

c# - 调用函数的设置方法

无法找到 Angular Material MatTableDataSource

angular5 - ag-grid:如何在主详细信息模板中添加按钮

Angular 5 使用 blob 响应和 json 错误管理 http get

asp.net - 找不到控件(ASP.NET、MS 测试)

css - :host selector for angular-material dialog

angular - 移动设备上的 Material 2 md-tab-nav-bar 换行

angular - 如何使用 karma 在 Angular 中对异步 ngIf 进行单元测试