Tengo este error en mi terminal:
TypeError: no se pueden leer las propiedades de undefined (leyendo 'id')
Estoy intentando probar la llamada a una API, pero aparece el error.
Mi función:
itemToForm = () => { this.api.send(this.component, 'get', { lang: 'ES', filter: { id: this.item['id'] } } ).then(resEsp => { this.item = resEsp['data'][0]; this.api.send(this.component, 'get', { lang: 'EN', filter: { id: this.item['id'] } } ).then(res => { let itemEng = res['data'][0]; let fields = this.formDef.map(register => register.filter( field => field['register_table'].indexOf('traduction') !== -1 ).map( field => field['field_name']) ).filter(register => register.length); fields = fields.length ? fields[0] : []; if (itemEng) { this.item = Object.keys(itemEng).reduce((obj, key) => { obj[key] = this.item[key]; if (fields.indexOf(key) !== -1) { obj[key + '_eng'] = itemEng[key]; } return obj; }, {}); } if (this.item) { this.setForm(); } }) }) }Mi archivo de especificaciones:
it('should call api.send', () => { let spy1 = spyOn(api, 'send'); let item = { id: 1, name: 'test', } component.addItem(item); component.itemToForm(); expect(spy1).toHaveBeenCalled(); });Lo que está sucediendo:
Se llama a la función itemToForm() antes de que this.item esté listo.
Hay muchas estrategias para evitar este error. Una muy simple es agregar un receptor al comienzo de la función, así:
itemToForm = () => { if(this.item === undefined) {return} // The rest of the code }Esto detiene la función, si los datos aún no existen.
Una solución más elegante puede ser ir más arriba en su orden de operaciones y encontrar quién está llamando a itemToForm() y asegurarse de que los datos existan antes de llamar.
Me encontré con esta pregunta, pero mi problema era en realidad algo completamente diferente.
En mi código por algunas razones tuve
import { SOME_OBJECT } from '.';que en su lugar debería ser así:
import { SOME_OBJECT } from './proper-file';