Angular 测试 - 无法解析 MyOverlayRef 的所有参数:(?, ?, ?)

Angular Testing- Can't resolve all parameters for MyOverlayRef: (?, ?, ?)

我在 angular 中基于 this blogs code 创建了一个可重复使用的叠加模式。我有一个名为 overlay-ref.ts 的文件,代码为

export class MyOverlayRef<R = any, T = any> {
  constructor(
    public overlay: OverlayRef,
    public content: string | TemplateRef<any> | Type<any>,
    public data: T // pass data to modal i.e. FormData
  ) {}
}

如您所见,它没有用 @Injectable 修饰,所以当我在我的组件中使用这个文件时,我会像这样使用它

export class CompanyContactOverlayComponent implements OnInit {
 
  constructor(public ref: MyOverlayRef){} 
 }

在我的组件中它可以工作,但是当我测试组件时我是这样使用它的

beforeEach(async () => {
    await TestBed.configureTestingModule({
      declarations: [CompanyContactOverlayComponent],
      providers: [MyOverlayRef]
    })
    .compileComponents();
  });

它给我一个错误 Can't resolve all parameters for MyOverlayRef: (?, ?, ?)。看到很多这样的问题,但找不到任何答案。

我的直觉是,因为它不是 @injectable,所以我不能在 provider[] 中使用它。

我可以通过任何方式自动创建它的实例并解决此问题。

编辑 在服务 class 中,我正在创建一个要注入到 ref-class

的自定义注入器
open<R = any, T = any>(
    content: string | TemplateRef<any> | Type<any>,
    data: T
  ): MyOverlayRef<R> {
    const configs = new OverlayConfig({
      hasBackdrop: true,
      scrollStrategy: this.overlay.scrollStrategies.block(),
    });

    const overlayRef = this.overlay.create(configs);

    const myOverlayRef = new MyOverlayRef<R, T>(overlayRef, content, data);

    const injector = this.createInjector(myOverlayRef, this.injector);

    overlayRef.attach(new ComponentPortal(OverlayModalComponent, null, injector));

    return myOverlayRef;
  }

  createInjector(ref: MyOverlayRef, inj: Injector) {
    const injectorTokens = new WeakMap([[MyOverlayRef, ref]]);
    return new PortalInjector(inj, injectorTokens);
  }

尝试为其提供模拟值。

const mockOverlayRef = {}; // add the properties that are required, here it is an empty object

beforeEach(async () => {
    await TestBed.configureTestingModule({
      declarations: [CompanyContactOverlayComponent],
      providers: [{ provide: MyOverlayref, useValue: mockOverlayRef }] // mock it like so.
    })
    .compileComponents();
  });