Angular 测试:使用 Any 数据类型模拟 类 和服务

Angular Test: Use Data Type Any to Mock Classes and Services

我在没有 TestBed 的情况下使用 Fake 类 模拟服务。 使用具有以下 : any 数据类型的 Mock 是一种好习惯吗? 如果不是,我会收到以下错误,缺少 items/parameters.

我可以使用 spyOn,但它需要 TestBed,并且我试图避免摆脱所有可执行文件 -运行 时间错误,'with injectable import not found' with testBed。

https://medium.com/angular-in-depth/angular-testbed-considered-harmful-3f91f647d1fd

https://dev.to/angular/unit-testing-in-angular-to-testbed-or-not-to-testbed-3g3b

  class ConfigMgmtServiceMock {
    modifyLkDocumentDiscardReasonPost() : Observable<any> { 
      let data = 'test';
      return of(data);
    };
  }

  let configMgmtServiceMock: any = new ConfigMgmtServiceMock();
  let snackBarMock : any = new SnackBarMock();

  beforeEach(() => {
    configMgmtServiceMock = new ConfigMgmtServiceMock();
    snackBarMock = new SnackBarMock();
    component = new DocumentDiscardLookupEditorComponent(null, configMgmtServiceMock, snackBarMock);
    component.gridRef = new GridMock() as any;
  });

你可以使用any,它带来的唯一问题 - 类型安全的松散,因此如果modifyLkDocumentDiscardReasonPost的签名已更改,例如它不会return 不再承诺 - 那么就没有打字稿错误了。

如果你想模拟 类 并避免失去类型安全,你可以考虑使用 ng-mocks,它允许创建模拟形状并同时保持类型安全,所以如果有人更改了类型 - 打字稿也会让开发人员在模拟中了解这一点。

beforeEach(() => MockBuilder(DocumentDiscardLookupEditorComponent)
  .mock(ConfigMgmtService, {
    modifyLkDocumentDiscardReasonPost: () => {
      let data = 'test';
      return of(data);
    },
  })
  .mock(SnackBar, {
     something: 'in-snack-bar',
  })
});