派生 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