#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. Возможно, вам потребуется поделиться более подробной информацией (кодом), поскольку для меня это работает. Это может быть совершенно другая область.