Формирует ошибку массива при модульном тестировании с использованием jasmine и karma

#angular #angular-material #jasmine #karma-jasmine

#angular #angular-материал #jasmine #karma-jasmine

Вопрос:

Я пишу модульный тестовый пример для приложения angular версии 9. но я получаю ошибку ниже.

Ошибка типа: не удается прочитать свойство ‘get’ неопределенного

как шпионить методы getFormControls, иначе я должен использовать spyonproperty, я попытался установить spyonproperty, но получаю другую ошибку.

я новичок в модульном тестировании jasmine, который поражает большую часть места,

ts:

   get getFormControls() {
    const control = this.relTable.get('tableRows') as FormArray;
    return control;
  }

submit() {
    this.messageService.clear();

/*     const formGroup = this.getFormControls.controls[this.isEdit.length - 1] as FormGroup;
    const rNameValue = formGroup.controls['rName'].value;
    const pEntityValue = formGroup.controls['pEntity'].value;
    const cEntityValue = formGroup.controls['cEntity'].value;


    this.new_rel_Data.push({
      'rName': rNameValue,
      'pEntity': pEntityValue,
      'cEntity': cEntityValue
    });  */



     this.new_rel_Data.push({
      'rName': this.getFormControls.controls[this.isEdit.length - 1].get('rName').value,
      'pEntity': this.getFormControls.controls[this.isEdit.length - 1].get('pEntity').value,
      'cEntity': this.getFormControls.controls[this.isEdit.length - 1].get('cEntity').value
    }); 

    this.relTemp.addReldata(this.new_rel_Data).subscribe(
      (res) => {
        console.log(res);
        this.loadRelTemp();
        this.messageService.add({ severity: 'success', summary: 'New value inserted successfully', sticky: true });
      },
      (err) => {
        this.messageService.add({ severity: 'error', summary: err.message, detail: 'Please contact Admin', sticky: true });
      },
      () => {
        const control = this.relTable.get('tableRows') as FormArray;
        control.clear();
        this.enableSubmit = false;
      }
    );

  }
  

спецификация:

  // submit for insert new value
  fit('Submit() Relational data', () => {

    let data = [ 'foo' ];
    component.new_rel_Data = data;

  fixture.detectChanges();
    spyOn(component, 'submit').and.callThrough();
    

    spyOn(relTemplateUpdateService, 'addReldata').and.returnValue(
      of({ result: { status: 200 } })
    );
    component.submit();
    fixture.detectChanges();
    expect(component.submit).toHaveBeenCalled();
    expect(relTemplateUpdateService.addReldata).toHaveBeenCalledWith(data);
  });
  

Ответ №1:

Когда у вас возникают ошибки, подобные этим: TypeError: Cannot read property 'get' of undefined , обычно это означает, что вы забыли добавить / смоделировать что-то в своих тестах (хотя это может произойти и в реальном коде).

В данном конкретном случае вы пропустили либо имитацию relTable , либо результат getFormControls getter .

В любом случае, я бы, вероятно, издевался над получателем следующим образом:

 spyOnProperty(relTemplateUpdateService, 'getFormControls').and.returnValue(new FormArray([
    new FormGroup({
      rName: new FormControl('rName'),
      pEntity: new FormControl('pEntity'),
      cEntity: new FormControl('cEntity'),
    }),
  ]));
  

Поскольку TypeScript не позволяет присваивать получателю, вам, вероятно, потребуется использовать spyOnProperty метод вместо чего-то подобного relTemplateUpdateService.getFormControls = ... . Если бы это был не геттер, то вы могли бы также издеваться this.relTable с тем же возвращаемым значением, но я лично не обнаружил, что это работает с геттером.

Также вы должны проверить (вероятно, лучше в реальном коде; если вы не уверены, что вам это не нужно), что this.isEdit значение всегда больше 0, в противном случае вы получите другую ошибку с undefined .

Комментарии:

1. все еще получаю ту же ошибку, и я должен изменить relTemplateUpadteService на компонент, как показано ниже, потому что getFormControls — это метод, который находится внутри компонента. spyOnProperty(компонент, ‘getFormControls’).и.returnValue(новый FormArray([ новая FormGroup({ rName: новый FormControl(‘rName’), pEntity: новый FormControl(‘pEntity’)),

2. Возможно, вам потребуется поделиться более подробной информацией (кодом), поскольку для меня это работает. Это может быть совершенно другая область.