2016-07-13 82 views
33

L'unità sta testando un componente utilizzato per modificare un oggetto. L'oggetto ha un id univoco che viene utilizzato per prelevare l'oggetto specifico da una matrice di oggetti ospitati in un servizio. Lo specifico id viene fornito tramite un parametro passato tramite il routing, in particolare tramite la classe ActivatedRoute.Come testare un componente che dipende dai parametri di ActivatedRoute?

Il costruttore è la seguente:

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]; 

voglio correre test di unità di base su questo componente. Tuttavia, non sono sicuro di come sia possibile iniettare il parametro id e il componente ha bisogno di questo parametro come.

A proposito: ho già una simulazione per il servizio Session, quindi non preoccuparti.

risposta

53

Il modo più semplice per farlo è di utilizzare solo l'attributo useValue e fornire un osservabile del valore che si desidera prendere in giro.

{ 
    provide: ActivatedRoute, 
    useValue: { 
    params: Observable.of({id: 123}) 
    } 
} 
+8

Observable.of non esiste per me! : S –

+3

Import Observable from rxjs/Observable – zmanc

+6

Questo codice genera questo errore nel mio progetto: 'Uncaught NetworkError: Impossibile eseguire 'send' su 'XMLHttpRequest': Impossibile caricare 'ng: ///DynamicTestModule/HomeContentComponent.ngfactory.js '. all'indirizzo http: // localhost: 9876/_karma_webpack_/polyfills.bundle.js: 2605' – MixerOID

12

Ho capito come fare!

Poiché ActivatedRoute è un servizio, è possibile stabilire un servizio di simulazione. Chiamiamo questo servizio simulato MockActivatedRoute. Si estenderà ActivatedRoute in MockActivatedRoute, come segue:

class MockActivatedRoute extends ActivatedRoute { 
    constructor() { 
     super(null, null, null, null, null); 
     this.params = Observable.of({id: "5"}); 
    } 

La linea super(null, ....) inizializza il super classe, che ha quattro parametri obbligatori. Tuttavia, in questo caso, non abbiamo bisogno di nulla da nessuno di questi parametri, quindi li inizializziamo ai valori null. Tutto ciò di cui abbiamo bisogno è il valore di params che è un Observable<>. Pertanto, con this.params, si sostituisce il valore di params e lo si inizializza come Observable<> del parametro su cui si basa il soggetto di test.

Quindi, come qualsiasi altro servizio di simulazione, è sufficiente inizializzarlo e sovrascrivere il provider per il componente.

Buona fortuna!

+1

sto affrontando questo proprio ora! Tuttavia, sto ricevendo errori quando tento di usare 'super' o' Observable'. Da dove vengono questi? – Aarmora

+0

'super()' è incorporato. 'Osservabile' è da' rxjs/Observable' o semplicemente 'rxjs' a seconda della versione. Lo otterresti usando 'import {Observable} da 'rxjs''. – oooyaya

5

Ecco come ho provato a angolare 2.0 ultima ...

import { ActivatedRoute, Data } from '@angular/router'; 

e nella sezione Provider

{ 
     provide: ActivatedRoute, 
     useValue: { 
      data: { 
      subscribe: (fn: (value: Data) => void) => fn({ 
       yourData: 'yolo' 
      }) 
      } 
     } 
     } 
+0

Puoi fornire il codice completo per la sezione dei fornitori? –

+0

Questa è una classe di test unitaria completa. https://plnkr.co/edit/UeCKnJ2sCCpLLQcWqEGX?p=catalogue – abdelrady

+0

Come si fa a testare unsubscribe in ngOnDestroy – shiva

1

Basta aggiungere un mock del ActivatedRoute:

providers: [ 
    { provide: ActivatedRoute, useClass: MockActivatedRoute } 
] 

...

class MockActivatedRoute { 
    // here you can add your mock objects, like snapshot or parent or whatever 
    // example: 
    parent = { 
    snapshot: {data: {title: 'myTitle ' } }, 
    routeConfig: { children: { filter:() => {} } } 
    }; 
} 
Problemi correlati