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();
});
我在 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();
});