Estos días he estado migrando una app de Angular 14 a Angular 16 y entre tantos cambios, hay un sub-proyecto que tenemos que vincular y también actualizarlo a Angular 16. Resulta que al hacer la actualización recibíamos el error:
NG0203: inject() must be called from an injection context such as a constructor, a factory function, a field initializer, or a function used with...
Lo raro es que no se usa inject
aquí, se utiliza Dependency Injection como es más estándar, y el error pasaba solo en unas pruebas. Buscando muchísimo en internet nadie hablaba de esta posibilidad… así que si llegaste hasta aquí, y estás sufriendo por este error como yo sin dar con una solución, aquí te va… peeero antes de ello quiero decir que esto nos sucedió con Angular 16 + Jest en pruebas unitarias únicamente, no nos sucedía en el proyecto en sí mismo por lo que era aún más raro, ahora sí ahí va…
El problema no estaba en el código como tal, estaba en que el sub-proyecto lo vinculábamos con npm link
y el problema es que estaba en que no se vinculaba para pruebas correctamente… para ello te dan la opción de poner preserveSymLinks: true
en el angular.json
pero tampoco nos servía puesto que esto está hecho con ng-packagr
haciendo que sea aún más complejo encontrar la forma ya que en lo anteriormente mencionado te dicen que lo pongas en el architect.build.options
pero ahí no puede entrar con esta configuración así que… bueno, ¿y mi «posible reparación on’ ta»?, el problema entonces es npm link
, ¿cómo lo solucionamos?, simple… dejamos de usar npm link
y ahora usamos el repositorio como vía.
Compilamos el proyecto, generamos una rama temporal y empujamos el proyecto para que compilado en el root, así entonces, instalamos desde `npm install git+ssh://[email protected]/usuario/repositorio#rama_compilada solo es acomodar esto para su propio repo y tan tan, nos quitamos el problema de encima.
Así que ya saben, si tienen este problema con pruebas, el problema no es con su código, es el npm link
que tiene un error aquí… pero ya saben que pueden resolver con preserveSymLinks
si no usan ng-packagr
y si lo usan y no los deja compilen y usen un repo intermediario mientras terminan…
¡Nos vemos en el próximo tutorial!