Производные классные испытания.Ошибка: не удается разрешить все параметры для: (?,?) (Угловой 5) - PullRequest
0 голосов
/ 11 марта 2019

У меня есть простая структура с абстрактным классом, производным классом и тестом. Когда я пытаюсь запустить Karma, выдается следующее сообщение об ошибке:

Failed: Can't resolve all parameters for ActivationsComponent: (?, ?).

Это мой абстрактный класс:

export abstract class DeviceDetailsWidget implements OnChanges {

  @Input() details: DeviceDetails;
  abstract visibleForTypes = [];

  constructor(
    protected el: ElementRef,
    protected constants: Constants
  ) { }
}

Мой класс компонентов:

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

Я смотрел на другие ошибки, подобные этой, но я не мог понять, как заставить это работать. Это не единственный виджет в зависимости от этого абстрактного класса. На самом деле у меня много виджетов в зависимости от DeviceDetailsWidget, но это самый простой.

Отредактировано : я обновил класс ActivationsComponent.

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Это скорее обходной путь, чем реальное решение проблемы, но ошибка должна исчезнуть, если вы используете @Inject в конструкторе базового класса.Это боль, но довольно маленькая по сравнению с созданием явных конструкторов во всех ваших зависимых классах.Результирующий конструктор базового класса будет выглядеть следующим образом:

constructor(
    @Inject(ElementRef) protected el: ElementRef,
    @Inject(Constants) protected constants: Constants
 )

Возможно, вам придется предоставить Constants в массиве провайдера для объекта, переданного в TestBed.configureTestingModule.

0 голосов
/ 11 марта 2019

Вы должны вызвать конструктор DeviceDetailsWidget в ActivationsComponent следующим образом:

export class ActivationsComponent extends DeviceDetailsWidget {
   constructor()
   {
     super(elementRef, constants)
   }
}
...