2016-07-15 159 views
10

Voglio testare un componente semplice che ha alcune dipendenze. Quindi tra gli altri devo fornire alcuni fornitori.Errore test unità angolare 2: Impossibile risolvere tutti i parametri per 'RequestOptions'

/* tslint:disable:no-unused-variable */ 

import { By }   from '@angular/platform-browser'; 
import { DebugElement, provide } from '@angular/core'; 

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

import { AuthHttp, AuthConfig } from 'angular2-jwt'; 
import { Router, provideRouter } from '@angular/router'; 
import { Http, ConnectionBackend, RequestOptions, HTTP_PROVIDERS } from '@angular/http'; 
import { LogoutButtonComponent } from './logout-button.component'; 
import { UserService } from '../../services/index'; 

describe('Component: LogoutButtonComponent',() => { 

    let component: LogoutButtonComponent; 

    beforeEachProviders(() => [ 
    LogoutButtonComponent, 
    Http, 
    provide(AuthHttp, { useFactory: Http }), 
    provide(AuthConfig, { useValue: new AuthConfig() }), 
    ConnectionBackend, 
    RequestOptions, 
    UserService 
    ]); 

    beforeEach(inject([AuthHttp, UserService, LogoutButtonComponent], 
    (comp: LogoutButtonComponent) => { 
     component = comp; 
    })); 

    it('should inject UserService',() => { 
    // My test here 
    }); 

}); 

se sto ottenendo il seguente errore:

Error: Cannot resolve all parameters for 'RequestOptions'(?). Make sure that all the parameters are decorated with Inject or have valid type annotations and that 'RequestOptions' is decorated with Injectable.

Mi sto perdendo qualcosa oin la funzione beforeEachProviders?

Nota: questa domanda è relativa solo al test unitario di Angular 2 con Jasmine. Non sto cercando informazioni relative all'app di bootstrap perché questo è già ok nella mia app e ci sono altre domande correlate qui.

risposta

4

RequestOptions non è un iniettabile, non lo si inserisce nelle classi. Invece, si istanzia uno quando necessario quando si effettua una richiesta HTTP. Così è possibile rimuoverlo dal beforeEachProviders, e istanziare uno nel beforeEach se effettivamente bisogno nei test:

let options: RequestOptions; 

beforeEach(inject([AuthHttp, UserService, LogoutButtonComponent], 
    (comp: LogoutButtonComponent) => { 
     component = comp; 
     options = new RequestOptions({method: RequestMethod.Post}); 
})); 
+0

Hi @Sunil, in questo caso sto ottenendo: 'Errore: nessun provider per RequestOptions! (AuthHttp -> RequestOptions) ' –

+0

@VassilisPits dove ricevi questo errore? Da qualche parte stai cercando di iniettare 'RequestOptions', e non dovresti farlo. 1) Non puoi iniettare questa classe, non ha l'annotazione 'Injectable()', controlla la [fonte] (https://github.com/angular/angular/blob/2.0.0-rc.4/modules/ % 40angular/http/src/base_request_options.ts # L17-L123). Hai solo bisogno di istanziare l'oggetto 'RequestOptions' con l'operatore' new' come mostrato sopra, e come mostrato nella [documentazione] (https://angular.io/docs/ts/latest/api/http/index/ RequestOptions-class.html). –

+0

Non sto iniettando da qualche altra parte, questa è la cosa strana:/ –

17

È necessario importare HttpModule nella propria configurazione TestBed.

import { HttpModule } from "@angular/http"; 

TestBed.configureTestingModule({ 
    imports: [ 
    HttpModule 
    ] 
}); 

Dopo che il test delle unità dovrebbe funzionare

+0

Hai salvato la mia giornata ... Grazie. –

+0

Questa è l'unica soluzione che funziona per il nuovo Angular 4 in cui 'beforeEachProviders' è stato deprecato. –

2

Ho risolto il mio errore importando HttpModule e Http da @angular/http:

import {HttpModule, Http} from "@angular/http"; 
... 

TestBed.configureTestingModule({ 
    imports: [HttpModule], // <!-- HTTP module 
    providers: [HttpService, SourceService, Http] // <!-- HTTP 
});