派生 class 个测试。失败:无法解析 : (?, ?) (Angular 5) 的所有参数
Derived class tests. Failed: Can't resolve all parameters for : (?, ?) (Angular 5)
我有一个简单的结构,包含一个抽象 class、一个派生 class 和一个测试。当我尝试 运行 Karma 时,抛出以下错误:
Failed: Can't resolve all parameters for ActivationsComponent: (?, ?).
这是我的摘要class:
export abstract class DeviceDetailsWidget implements OnChanges {
@Input() details: DeviceDetails;
abstract visibleForTypes = [];
constructor(
protected el: ElementRef,
protected constants: Constants
) { }
}
我的组件class:
@Component({
selector: 'dd-dp-activations',
templateUrl: './activations.component.html',
styleUrls: ['./activations.component.scss']
})
export class ActivationsComponent extends DeviceDetailsWidget {
visibleForTypes = [this.constants.DEVICE_SHORT_TYPE.TOTO_SINK];
}
我的测试:
describe('ActivationsComponent', () => {
let component: ActivationsComponent;
let fixture: ComponentFixture<ActivationsComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ActivationsComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ActivationsComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
我正在查看与此类似的其他错误,但我不知道如何让它起作用。这不是唯一依赖于此摘要的小部件 class。其实我有很多依赖DeviceDetailsWidget的widget,但是这个是最简单的
已编辑:我更新了 ActivationsComponent class。
您必须像这样在 ActivationsComponent 中调用 DeviceDetailsWidget 的构造函数:
export class ActivationsComponent extends DeviceDetailsWidget {
constructor()
{
super(elementRef, constants)
}
}
这更像是一种解决方法,而不是问题的实际解决方案,但如果您在基础 class 构造函数中使用 @Inject
,错误应该会消失。与在所有依赖的 classes 上创建显式构造函数相比,这是一个痛苦但相当小的痛苦。生成的基础 class 构造函数如下所示:
constructor(
@Inject(ElementRef) protected el: ElementRef,
@Inject(Constants) protected constants: Constants
)
您可能必须在传递给 TestBed.configureTestingModule
的对象的提供程序数组中提供 Constants
。
我有一个简单的结构,包含一个抽象 class、一个派生 class 和一个测试。当我尝试 运行 Karma 时,抛出以下错误:
Failed: Can't resolve all parameters for ActivationsComponent: (?, ?).
这是我的摘要class:
export abstract class DeviceDetailsWidget implements OnChanges {
@Input() details: DeviceDetails;
abstract visibleForTypes = [];
constructor(
protected el: ElementRef,
protected constants: Constants
) { }
}
我的组件class:
@Component({
selector: 'dd-dp-activations',
templateUrl: './activations.component.html',
styleUrls: ['./activations.component.scss']
})
export class ActivationsComponent extends DeviceDetailsWidget {
visibleForTypes = [this.constants.DEVICE_SHORT_TYPE.TOTO_SINK];
}
我的测试:
describe('ActivationsComponent', () => {
let component: ActivationsComponent;
let fixture: ComponentFixture<ActivationsComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ActivationsComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ActivationsComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
我正在查看与此类似的其他错误,但我不知道如何让它起作用。这不是唯一依赖于此摘要的小部件 class。其实我有很多依赖DeviceDetailsWidget的widget,但是这个是最简单的
已编辑:我更新了 ActivationsComponent class。
您必须像这样在 ActivationsComponent 中调用 DeviceDetailsWidget 的构造函数:
export class ActivationsComponent extends DeviceDetailsWidget {
constructor()
{
super(elementRef, constants)
}
}
这更像是一种解决方法,而不是问题的实际解决方案,但如果您在基础 class 构造函数中使用 @Inject
,错误应该会消失。与在所有依赖的 classes 上创建显式构造函数相比,这是一个痛苦但相当小的痛苦。生成的基础 class 构造函数如下所示:
constructor(
@Inject(ElementRef) protected el: ElementRef,
@Inject(Constants) protected constants: Constants
)
您可能必须在传递给 TestBed.configureTestingModule
的对象的提供程序数组中提供 Constants
。