2016-12-12 5 views
0

Ich erstelle eine eckige 2-Anwendung mit Typoskript und muss den Dienst mit Jasmine testen. Wie Sie in der Testmethode sehen können, muss ich http zu meinem Dienst für diese Arbeit injizieren. Wie injiziere ich HTTP in meinen Dienst? Dies ist die Codezeile, die ich bezieheInjizieren in Jasmine

var _getCustomerService: GetCustomerService = neu GetCustomerService (http);

Service-Methode

@Injectable() 
export class GetCustomerService { 

    constructor(private http: Http) { } 

    private customerUrl = 'http://localhost:45870/api/getcustomer'; 

    getCustomer(): Observable<Customer[]> { 

     return this.http.get(this.customerUrl) 
      .map((res: Response) => res.json()) 
      .catch((error: any) => Observable.throw(error.json().error || 'Server Error')); 
    } 
} 

Jasmin Test

describe("Service test", function() { 

    it("check service", function() { 
     var http: Http; 
     var _getCustomerService: GetCustomerService = new GetCustomerService (http); 
     _getCustomerService.getCustomer() 
      .subscribe(
      (Customer: Customer[]) => { 
       var customer: Customer[]; 
       customer = Customer; 
       expect(customer).toBeDefined(); 
      }); 


    }); 

}); 

Antwort

0

Sie wollen nicht echte XHR-Anfragen für die Tests machen, so dass Sie ein für spezialisiert auf erstellen müssen die Tests, in denen Sie für jede Anfrage Scheinantworten festlegen können. Um dies zu tun, müssen Sie eine Fabrik benutzen, um Ihre eigenen Http, zu erstellen und auch die MockBackend

import { MockBackend, MockConnection } from '@angular/http/testing'; 
import { Http, HttpMdodule, XHRBackend, RequestOptions, Response, ResponseOptions 
     } from '@angular/http'; 
import { TestBed, async } from '@angular/core/testing'; 

describe('..',() => { 
    let backend: MockBackend; 
    let service: GetCustomerService; 

    beforeEach(() => { 
    const injector = TestBed.configureTestingModule({ 
     imports: [HttpModule], 
     providers: [ 
     GetCustomerService, 
     RequestOptions, 
     MockBackend, 
     { 
      provide: Http, 
      deps: [MockBackend, RequestOptions], 
      useFactory: (backend: MockBackend, options: RequestOptions) => { 
      return new Http(backend, options); 
      } 
     } 
     ] 
    }); 

    backend = injector.get(MockBackend); 
    service = injector.get(GetCustomerService); 
    }); 
}); 

nun in Ihren Tests machen, möchten Sie die Anschlüsse der MockBackend so zeichnen, dass Sie senden können auch eine Antwort, wenn eine Verbindung kommt in

it('..', async(() => { 
    backend.connections.subscribe((conn: MockConnection) => { 
    conn.mockRespond(new Response(new ResponseOptions({ body: 'some body ' }))); 
    }); 

    service.getCustomer().subscribe((Customer: Customer[]) => { 
    expect(customer).toBeDefined(); 
    }); 
})); 

See:

+0

Ich erhalte Fehler bei dieser Codezeile useFactory: (Backend, Optionen) => { return new Http (Backend, Optionen); }. Seine sagt Parameter Backend Implity hat alle Arten. Gleiche Nachricht für Optionen – Tom

+0

Was ist die Fehlermeldung? Siehe meine Bearbeitung. Vielleicht müssen Sie nur einen Typ zu den Parametern hinzufügen –

+0

Sein sagt Parameter Backend Implizität hat alle Arten. Die gleiche Nachricht für Optionen – Tom