Estoy probando un componente que se usa para editar un objeto. El objeto tiene una característica única id
que se usa para tomar el objeto específico de una matriz de objetos que están alojados en un servicio. El específico id
se obtiene a través de un parámetro que se pasa a través del enrutamiento, específicamente a través de la ActivatedRoute
clase.
El constructor es el siguiente:
constructor(private _router:Router, private _curRoute:ActivatedRoute, private _session:Session) {
}
ngOnInit() {
this._curRoute.params.subscribe(params => {
this.userId = params['id'];
this.userObj = this._session.allUsers.filter(user => user.id.toString() === this.userId.toString())[0];
Quiero ejecutar pruebas unitarias básicas en este componente. Sin embargo, no estoy seguro de cómo puedo inyectar el id
parámetro y el componente necesita este parámetro.
Por cierto: ya tengo una simulación del Session
servicio, así que no te preocupes.
Uncaught NetworkError: Failed to execute 'send' on 'XMLHttpRequest': Failed to load 'ng:///DynamicTestModule/HomeContentComponent.ngfactory.js'. at http://localhost:9876/_karma_webpack_/polyfills.bundle.js:2605
of
debe usarse solo. También es probable que use enRouterTestingModule
lugar del código de esta respuesta.¡He descubierto cómo hacer esto!
Dado que
ActivatedRoute
es un servicio, se puede establecer un servicio simulado. Llamemos a este servicio simuladoMockActivatedRoute
. ExtenderemosActivatedRoute
enMockActivatedRoute
, de la siguiente manera:La línea
super(null, ....)
inicializa la superclase, que tiene cuatro parámetros obligatorios. Sin embargo, en este caso, no necesitamos nada de ninguno de estos parámetros, por lo que los inicializamos anull
valores. Todo lo que necesitamos esparams
cuyo valor es unObservable<>
. Por lo tanto, conthis.params
, anulamos el valor deparams
y lo inicializamos para que sea elObservable<>
del parámetro en el que se basa el sujeto de prueba.Luego, como cualquier otro servicio simulado, simplemente inicialícelo y anule el proveedor del componente.
¡Buena suerte!
fuente
super
oObservable
. ¿De dónde vienen estos?super()
está integrado.Observable
es derxjs/Observable
o simplementerxjs
depende de su versión. Lo conseguirías usandoimport {Observable} from 'rxjs'
.En angular 8+ está el RouterTestingModule, que puede utilizar para tener acceso a ActivatedRoute o Router del componente. También puede pasar rutas al RouterTestingModule y crear espías para los métodos de ruta solicitados.
Por ejemplo, en mi componente tengo:
Y en mi prueba tengo:
y más tarde en la sección 'eso':
De manera similar, creo que puede probar directamente el paramMap a través del método spyOnProperty de jazmín, devolviendo un observable o usando canicas rxjs. Puede ahorrar algo de tiempo y tampoco requiere mantener una clase simulada adicional. Espero que sea útil y tenga sentido.
fuente
Así es como lo probé en angular 2.0 más reciente ...
y en la sección Proveedores
fuente
Simplemente agregue una simulación de ActivatedRoute:
...
fuente
Para algunas personas que trabajan en Angular> 5, if Observable.of (); no funciona, entonces pueden usar solo of () importando import {of} de 'rxjs';
fuente
Me encontré con el mismo problema al crear conjuntos de pruebas para una ruta de enrutamiento como:
En el componente, inicialicé la propiedad pasada como:
Cuando ejecute las pruebas, si no pasa un valor de propiedad en su Mock ActivatedRoute "useValue", entonces no estará definido cuando detecte cambios usando "fixture.detectChanges ()". Esto se debe a que los valores simulados de ActivatedRoute no contienen la propiedad params.property. Luego, es necesario que useValue simulado tenga esos parámetros para que el dispositivo inicialice 'this.property' en el componente. Puedes agregarlo como:
Puede comenzar a probar como, por ejemplo:
Ahora, digamos que le gustaría probar un valor de propiedad diferente, luego puede actualizar su Mock ActivatedRoute como:
¡Espero que esto ayude!
fuente
Proveedor agregado en la clase de prueba como:
fuente