2016-10-03 4 views
14

Ich verwende Unit-Tests mit Karma mit eckigen 2. Ich habe Router in meinem Dienst und aber wenn ich Testfall dafür schreiben, dass es durch mich folgenden Fehler.Angular 2 Unit-Test: Kann nicht alle Parameter für Router

Error: Can't resolve all parameters for Router: (?, ?, ?, ?, ?, ?, ?, ?). 

hier Code

spec.ts

import 'rxjs/add/operator/map'; 
import { Http, BaseRequestOptions, Response, ResponseOptions,ConnectionBackend } from '@angular/http'; 
import { MockBackend, MockConnection } from '@angular/http/testing'; 
import { GlobalUtils } from './global.utils'; 
import { Router} from '@angular/router'; 

import { TestBed, inject } from '@angular/core/testing'; 



describe('Global Utils : Meta urls API',() => { 
    let emptyMetaUrl = {}; 

    let metaUrl = { 
    LOGIN: '/operator/login', 
    META_API: '/meta-api' 
    }; 

    beforeEach(()=>TestBed.configureTestingModule({ 

    providers: [ 
     Router, 
     GlobalUtils, 
     BaseRequestOptions, 
     MockBackend, 
     { 
     provide: Http, 
     useFactory: function (backend:ConnectionBackend, defaultOptions:BaseRequestOptions) { 
      return new Http(backend, defaultOptions); 
     }, 
     deps: [MockBackend, BaseRequestOptions] 
     }, 

    ] 
    })); 


    let subject:GlobalUtils = null; 
    let backend:MockBackend = null; 
    let http:Http = null; 

    beforeEach(inject([GlobalUtils, MockBackend, Http], (_globalUtils:GlobalUtils, mockBackend:MockBackend,_http:Http) => { 
    subject = _globalUtils; 
    backend = mockBackend; 
    http = _http; 
    })); 

    it('Should have get Meta urls', (done) => { 

    backend.connections.subscribe((connection:MockConnection)=> { 
     let options = new ResponseOptions({ 
     body: JSON.stringify(metaUrl) 
     }); 
     connection.mockRespond(new Response(options)); 
    }); 

    http 
     .get(subject.metaUrl) 
     .subscribe((response) => { 

     subject.getMetaUrls(); // in this routing is use 

     expect(GlobalUtils.saveUrl).toEqual(metaUrl); 
     done(); 
     }); 

    }); 

}); 

I Routing in diesem Dienst verwendet Pfad zu navigieren.

service.ts

import {Injectable} from '@angular/core'; 
import { Router} from '@angular/router'; 
import {Http, Headers,Response} from '@angular/http'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/operator/catch'; 

@Injectable() 
export class GlobalUtils { 
    static saveUrl = { }; 

    head:Headers = new Headers(); 
    hostUrl:string = 'http://192.168.0.103:8000/'; 
    metaUrl:string = 'urls-metadata/'; 

    // constructor declare 
    constructor(public _http:Http,public _router:Router) { 
    this.head.append('Content-Type', 'application/json'); 
    } 

    /* 
    * this function is used for Http GET Request 
    * */ 
    urlGet(url:string) { 
    let headers = this.head; 
    return this._http.get(this.hostUrl + url, {headers: headers}) 
     .map(res => res.json()) 
     .map((res) => { 
     return res; 
     }); 
    } 

    /* 
    * this function is used to GET all API url 
    * */ 
    getMetaUrls():any{ 
    let url = this.metaUrl; 
    this.urlGet(url).subscribe(
     (result) => { 
     console.log('result = '+JSON.stringify(result)); 
      if (result) { 
      GlobalUtils.saveUrl = result; 
      console.log('get Meta urls response = '+ result.status) 
      } 
     }, 

     (error)=> { 
     this._router.navigate(['page-error']); 
     console.log('get Meta urls error = '+ error.status + " data =" +JSON.stringify(error)) 
     }, 

    ()=>{console.log('get Meta url is successfully')} 

    ); 
    } 



} 

wenn ich Karma führen Sie diesen Testfall mit diesem Fehler fehlgeschlagen starten.

✖ Should have get Meta urls 
     Chrome 52.0.2743 (Linux 0.0.0) 
    Error: Can't resolve all parameters for Router: (?, ?, ?, ?, ?, ?, ?, ?). 
     at CompileMetadataResolver.getDependenciesMetadata (webpack:///~/@angular/compiler/bundles/compiler.umd.js:14404:0 <- config/spec-bundle.js:53297:22) 
     at CompileMetadataResolver.getTypeMetadata (webpack:///~/@angular/compiler/bundles/compiler.umd.js:14301:0 <- config/spec-bundle.js:53194:29) 
     at webpack:///~/@angular/compiler/bundles/compiler.umd.js:14448:0 <- config/spec-bundle.js:53341:44 
     at Array.forEach (native) 
     at CompileMetadataResolver.getProvidersMetadata (webpack:///~/@angular/compiler/bundles/compiler.umd.js:14428:0 <- config/spec-bundle.js:53321:22) 
     at CompileMetadataResolver.getNgModuleMetadata (webpack:///~/@angular/compiler/bundles/compiler.umd.js:14181:0 <- config/spec-bundle.js:53074:61) 
     at RuntimeCompiler._compileComponents (webpack:///~/@angular/compiler/bundles/compiler.umd.js:16803:0 <- config/spec-bundle.js:55696:50) 
     at RuntimeCompiler._compileModuleAndAllComponents (webpack:///~/@angular/compiler/bundles/compiler.umd.js:16747:0 <- config/spec-bundle.js:55640:40) 
     at RuntimeCompiler.compileModuleAndAllComponentsSync (webpack:///~/@angular/compiler/bundles/compiler.umd.js:16735:0 <- config/spec-bundle.js:55628:24) 
     at TestingCompilerImpl.compileModuleAndAllComponentsSync (webpack:///~/@angular/compiler/bundles/compiler-testing.umd.js:758:0 <- config/spec-bundle.js:38833:36) 
+0

Ich denke, dass Sie 'Router' in' Providern' nicht hinzufügen müssen. Versuchen Sie es nach dem Entfernen – ranakrunal9

Antwort

17

Wenn Sie eine tatsächliche Routing im Test tun sie sich nicht, können Sie nur ein Mock erstellen für sie

let mockRouter = { 
    navigate: jasmine.createSpy('navigate') 
} 

TestBed.configureTestingModule({ 
    providers: [ 
    { provide: Router, useValue: mockRouter } 
    ] 
}) 

Dann vielleicht in Ihrem Test, den Sie sicher machen wollen nur, dass die navigate Methode wird aufgerufen. Sie können

expect(mockRouter.navigate).toHaveBeenCalledWith(['/router']); 

tun Wenn Sie wollen tun echte Navigation testen, dann sollten Sie die RouterTestingModule verwenden, um alle Router-Anbieter und Richtlinien hinzuzufügen.

import { RouterTestingModule } from '@angular/router/testing'; 

TestBed.configureTestingModule({ 
    imports: [ 
    RouterTestingModule.withRoutes([{path: '', component: BlankCmp}, {path: 'simple', component: SimpleCmp}]) 
    ] 
}) 
+0

Das Hinzufügen von 'RouterTestingModule' zum Import-Array des Tests funktionierte für mich. –

Verwandte Themen