2016-06-28 20 views
5

Sto usando RC3. Sto implementando il nuovo router Angular2 come documentato qui: https://angular.io/docs/ts/latest/guide/router.htmlCome si inserisce un servizio angular2 in un test unitario? (RC3)

Tutto funziona correttamente ma sto riscontrando problemi nei test delle unità. Nello specifico, non posso iniettare servizi Angular2 nei miei test di unità.

Il mio codice componente rilevante è:

import {Component} from '@angular/core'; 
import {ActivatedRoute} from '@angular/router'; 

@Component({ 
    templateUrl: ... 
    styleUrls: ... 
}) 

export class Route1DetailComponent { 

    constructor(private route:ActivatedRoute) { 
    console.log(route); 
    } 
} 

mio test di unità si presenta come:

import { 
    expect, it, iit, xit, 
    describe, ddescribe, xdescribe, 
    beforeEach, beforeEachProviders, withProviders, 
    async, inject 
} from '@angular/core/testing'; 

import {ActivatedRoute} from '@angular/router'; 
import {Route1DetailComponent} from './route1-detail.component'; 
import {TestComponentBuilder} from '@angular/compiler/testing'; 

describe('route1-detail.component.ts',() => { 

    beforeEachProviders(() => [ 
    {provide: ActivatedRoute, useClass: ActivatedRoute} 
    ]); 

    it('should instantiate component', 
    async(inject([TestComponentBuilder, ActivatedRoute], (tcb:TestComponentBuilder, ar: ActivatedRoute) => { 
     tcb.createAsync(Route1DetailComponent).then((fixture) => { 
     expect(fixture.componentInstance instanceof Route1DetailComponent).toBe(true, 'should create Route1DetailComponent'); 
     console.log(ar); 
    }); 
    }))); 

});

Il test dell'unità "dovrebbe istanziare il componente" ha esito negativo. L'errore è:

Impossibile risolvere tutti i parametri per 'ActivatedRoute' (?,?,?,?,?). Assicurarsi che tutti i parametri siano decorati con Inject o che abbiano annotazioni di tipo valido e che 'ActivatedRoute' sia decorato con Iniettabile.

Come si ottiene questo funzionamento?

Quando non si esegue l'iniezione ActivatedRoute, tutto funziona correttamente.

Grazie.

+2

https://github.com/angular/angular/blob/fcfddbf79cfbdca45771bb31c0a2c1f55cff5801/modules/%40angular/router/test/router.spec.ts potrebbero aiutare –

+0

molto apprezzato ancora lavorando su questo thx molto utile - più idee di benvenuto:) – danday74

risposta

9

Durante il test delle unità, a volte un determinato servizio causa problemi solo perché non viene utilizzato in un ambiente normale. È possibile verificare per vedere se è stato chiamato, senza che il test dell'unità venga eseguito attraverso l'intero servizio. Fallo creando una classe di simulazione.

describe('route1-detail.component.ts',() => { 

class MockActivatedRoute {} 

beforeEachProviders(() => [ 
    {provide: ActivatedRoute, useClass: MockActivatedRoute} 
    ]); 

it('should instantiate component', 
    async(inject([TestComponentBuilder, ActivatedRoute], (tcb:TestComponentBuilder, ar: MockActivatedRoute) => { 
    tcb.createAsync(Route1DetailComponent).then((fixture) => { 
    expect(fixture.componentInstance instanceof Route1DetailComponent).toBe(true, 'should create Route1DetailComponent'); 
    console.log(ar); 
    }); 
}))); 

Avviso questa parte: inject([TestComponentBuilder, ActivatedRoute], (tcb:TestComponentBuilder, ar: MockActivatedRoute. Quando il codice sta cercando ActivatedRoute, lo stai passando al servizio di simulazione. Ovviamente se si sta provando in modo specifico a testare ActivatedRoute, allora la creazione di un servizio simulato annulla lo scopo. Potrebbe essere necessario aggiungere metodi o variabili alla classe mock se tenta di chiamare metodi da quel servizio.

+0

molto utile grazie - ancora lavorando su questo – danday74

+0

si è rivelata un'ottima risposta - grazie mille – danday74

+0

Felice di aiutare @ danday74 – jhhoff02

Problemi correlati