2016-01-07 16 views
7

Sto provando a testare un servizio che ha il router dell'applicazione iniettato nel suo costruttore. Seguendo i suggerimenti di Julie Ralph presentati in AngularConnect conf 2015 (e nel suo repository: https://github.com/juliemr/ng2-test-seed), sto usando Karma e Jasmine.Servizio test unità guasti con il router immesso nel costruttore in Angular 2

Ne consegue il servizio esempio da testare:

import { Router } from 'angular2/router'; 

export class ExampleService { 
    constructor(router : Router) { 
    this._router = router; 
    } 

    //... 
} 

In questo momento, sto solo affermando la verità. Ne consegue il test di servizio:

import { it, describe, expect, inject, beforeEachProviders, MockApplicationRef } from 'angular2/testing'; 
import { ROUTER_PROVIDERS } from 'angular2/router'; 
import { provide, ApplicationRef } from 'angular2/core'; 

import { ExampleService } from 'example-service.js'; 

describe('ExampleService',() => { 
    beforeEachProviders(() => [ 
    ROUTER_PROVIDERS, ExampleService, 
    provide(ApplicationRef, { useClass: MockApplicationRef }) 
    ]); 

    it('should validate the truth', inject([ExampleService], (exService) => { 
    expect(true).toBeTruthy(); 
    })); 
}); 

quando ho eseguito i test (> karma inizio karma.config.js), ottengo un TypeError: Impossibile leggere la proprietà 'lunghezza' di null

Guardando il router codice sorgente .js, sembra che dovrei riavviare almeno un componente prima di iniettare il router. Esiste un modo semplice per iniettare la dipendenza del router in un test?

Lo Stacktrace:

ORIGINAL EXCEPTION: TypeError: Cannot read property 'length' of null ORIGINAL STACKTRACE: TypeError: Cannot read property 'length' of null at routerPrimaryComponentFactory (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/router.js:2963:27) at Injector._instantiate (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:11920:19) at Injector._instantiateProvider (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:11859:21) at Injector._new (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:11849:19) at InjectorDynamicStrategy.getObjByKeyId (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:11733:42) at Injector._getByKeyDefault (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:12048:33) at Injector._getByKey (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:12002:21) at Injector._getByDependency (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:11990:21) at Injector._instantiate (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:11887:32) at Injector._instantiateProvider (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:11859:21) at Injector._new (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:11849:19) at InjectorDynamicStrategy.getObjByKeyId (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:11733:42) at Injector._getByKeyDefault (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:12048:33) at Injector._getByKey (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:12002:21) at Injector._getByDependency (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:11990:21) at Injector._instantiate (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:11887:32) at Injector._instantiateProvider (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:11859:21) at Injector._new (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:11849:19) at InjectorDynamicStrategy.getObjByKeyId (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:11733:42) at Injector._getByKeyDefault (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:12048:33) at Injector._getByKey (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:12002:21) at Injector._getByDependency (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:11990:21) at Injector._instantiate (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:11887:32) at Injector._instantiateProvider (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:11859:21) at Injector._new (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:11849:19) at InjectorDynamicStrategy.getObjByKeyId (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:11733:42) at Injector._getByKeyDefault (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:12048:33) at Injector._getByKey (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:12002:21) at Injector.get (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2.js:11804:19) at C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/testing.dev.js:2477:25 at Array.map (native) at Array.map (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/es6-shim/es6-shim.js:1113:14) at FunctionWithParamTokens.execute (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/testing.dev.js:2476:33) at C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/testing.dev.js:2601:25 at Zone.run (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/angular2-polyfills.js:138:17) at Zone.run (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/testing.dev.js:2544:30) at runInTestZone (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/testing.dev.js:2588:23) at Object. (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/angular2/bundles/testing.dev.js:2600:33) at attemptAsync (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1819:24) at QueueRunner.run (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1774:9) at QueueRunner.execute (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1762:10) at Spec.Env.queueRunnerFactory (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:627:35) at Spec.execute (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:353:10) at Object.fn (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:2360:37) at attemptAsync (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1819:24) at QueueRunner.run (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1774:9) at QueueRunner.execute (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1762:10) at Env.queueRunnerFactory (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:627:35) at Object.fn (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:2345:13) at attemptAsync (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1819:24) at QueueRunner.run (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1774:9) at C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1801:16 at C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1745:9 at queueRunnerFactory.onComplete (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:2348:17) at QueueRunner.clearStack (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:605:9) at QueueRunner.run (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1784:12) at C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1801:16 at C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1745:9 at complete (C:/Users/LSANTOS/Desktop/ng2-test-seed/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:365:9)

Vedi anche https://github.com/angular/angular/issues/6325

risposta

6

Problema risolto, solo bisogno di fornire la ROUTER_PRIMARY_COMPONENT.

import {ROUTER_PRIMARY_COMPONENT} from 'angular2/router'; 

class MockPrimaryComponent { 
} 

beforeEachProviders(() => [ 
    ROUTER_PROVIDERS, 
    provide(ROUTER_PRIMARY_COMPONENT, {useClass: MockPrimaryComponent}), 
    ExampleService, 
    provide(ApplicationRef, { useClass: MockApplicationRef }) 
]); 
+1

Hai anche configurato il router per un test utilizzando router.navigate()? –

+0

Come funziona con l'ultimo rc1? – hmrc87

3

So che questo post è correlato al vecchio router, ma ho pensato che potesse essere utile rispondere a questo. Usando la versione angolare rc.1 con il nuovo router, ho ottenuto unit test con il router, tra cui test navigateByUrl, utilizzando questo test entro angolare come ispirazione: https://github.com/angular/angular/blob/master/modules/%40angular/router/test/integration_spec.ts

mi ha salvato un sacco di grande caos

Ecco un lavoro esempio

import {setBaseTestProviders,beforeEachProviders,inject,it,describe,expect,beforeEach} from '@angular/core/testing' 

import { Component,provide} from '@angular/core'; 
import {Routes,ROUTER_DIRECTIVES,Route} from "@angular/router"; 

import {ComponentResolver} from '@angular/core'; 
import {Router,RouterOutletMap,RouteSegment,RouterUrlSerializer,DefaultRouterUrlSerializer} from '@angular/router'; 
import {SpyLocation} from '@angular/common/testing'; 
import {Location} from '@angular/common'; 
import {ComponentFixture, TestComponentBuilder} from '@angular/compiler/testing'; 

import {TEST_BROWSER_DYNAMIC_PLATFORM_PROVIDERS,TEST_BROWSER_DYNAMIC_APPLICATION_PROVIDERS} from '@angular/platform-browser-dynamic/testing'; 



@Component({ 
    selector: 'some-component', 
    template: `Blah!`, 
    directives: [ROUTER_DIRECTIVES] 
}) 
export class SomeComponent { 
} 

@Component({ 
    selector: 'another-component', 
    template: `Blah!`, 
    directives: [ROUTER_DIRECTIVES] 
}) 
export class AnotherComponent { 
} 

@Component({ 
    selector: 'root-cmp', 
    template: `<router-outlet></router-outlet>`, 
    directives: [ROUTER_DIRECTIVES] 
}) 
@Routes([ 
    new Route({path: '/some-path',component:SomeComponent}), 
    new Route({path: '/another-path',component:AnotherComponent}) 
    ]) 
export class RootCmp { 
} 

export const PROVIDERS_TESTING = [ 
    provide(RouterUrlSerializer, {useClass: DefaultRouterUrlSerializer}), 
    RouterOutletMap, 
    provide(Location, {useClass: SpyLocation}), 
    provide(RouteSegment, {useFactory: (r) => r.routeTree.root, deps: [Router]}), 
    provide(Router,{ 
     useFactory: (resolver, urlParser, outletMap, location) => new Router(
      "RootComponent", RootCmp, resolver, urlParser, outletMap, location), 
      deps: [ComponentResolver, RouterUrlSerializer, RouterOutletMap, Location] 
     } 
    ),  
] 

setBaseTestProviders(TEST_BROWSER_DYNAMIC_PLATFORM_PROVIDERS,[TEST_BROWSER_DYNAMIC_APPLICATION_PROVIDERS,PROVIDERS_TESTING]); 

it('some test',inject([Router, TestComponentBuilder, Location], (router:Router, tcb:TestComponentBuilder, location:Location) => { 
    return new Promise((resolve,reject)=>{ 
     tcb.createAsync(RootCmp).then(fixture=>{         
      router.navigateByUrl('/some-path').then(()=>{ 
       expect(location.path()).toEqual('/some-path'); 
       resolve() 
      }) 
     }) 
    }) 
})) 

it('another test',inject([Router, TestComponentBuilder, Location], (router:Router, tcb:TestComponentBuilder, location:Location) => { 
    return new Promise((resolve,reject)=>{ 
     tcb.createAsync(RootCmp).then(fixture=>{         
      router.navigateByUrl('/another-path').then(()=>{ 
       expect(location.path()).toEqual('/another-path'); 
       resolve() 
      }) 
     }) 
    }) 
})) 
Problemi correlati