2016-09-05 3 views
-1

Ich verwende derzeit Angular2 RC6. Mein Service ist wie folgt aufgebaut:Testen einer Angular2-Service-Methode

import { Injectable } from '@angular/core'; 
import { TodoModel } from '../models/'; 
import { Http, Response, Headers } from '@angular/http'; 
import { Observable } from 'rxjs/Rx'; 

@Injectable() 
export class TodoService { 
    baseURL = 'http://localhost:3000/todos'; 
    constructor(private _http: Http) { } 
    getTodos() { 
    return this._http.get(this.baseURL).map((res: Response) => res.json()); 
    } 
} 

und mein Test ist wie folgt aufgebaut:

import { MockBackend } from '@angular/http/testing'; 
import { Http, ConnectionBackend, BaseRequestOptions, Response, ResponseOptions } from '@angular/http'; 
import { TodoService } from './todo.service'; 
import { tick, async, inject, TestBed, fakeAsync } from '@angular/core/testing'; 
import { HttpModule, JsonpModule } from '@angular/http'; 

describe('TodoService',() => { 
    beforeEach(() => { 

    TestBed.configureTestingModule({ 
     imports: [HttpModule], 
     providers: [ 
     { 
      provide: Http, useFactory: (backend: ConnectionBackend, defaultOptions: BaseRequestOptions) => { 
      return new Http(backend, defaultOptions); 
     }, deps: [MockBackend, BaseRequestOptions] 
     }, 
     {provide: TodoService, useClass: TodoService}, 
     {provide: MockBackend, useClass: MockBackend}, 
     {provide: BaseRequestOptions, useClass: BaseRequestOptions} 
     ] 
    }); 
    }); 

    it('should have a method to get all Todos', 
    fakeAsync(inject([TodoService, MockBackend], (todoService: TodoService, mockBackend: MockBackend) => { 
     let res: Response; 
     mockBackend.connections.subscribe(c => { 
     expect(c.request.url).toBe('http://localhost:3000/todos'); 
     let response = new ResponseOptions({body: `[{"id": 5, "item": "do the laundry", "completed": false}]`}); 
     c.mockRespond(new Response(response)); 
     }); 
     todoService.getTodos().subscribe((response) => { 
     res = response; 
     }); 
     tick(); 
     expect(res[0].id).toBe(5); 
     expect(res[0].item).toBe('do the laundry'); 
     expect(res[0].completed).toBe(false); 
    })) 
); 
}); 

Nun, wenn ich das Gerät Test laufen über die ich erhalten:

undefined is not a constructor (evaluating 'this._http.get(this.baseURL).map(function(res){__cov_70hjYvYxeq9mxqcOWgRVeQ.f['4']++;__cov_70hjYvYxeq9mxqcOWgRVeQ.s['9']++;return res.json();})') (line 9) 

Ich bin nicht sicher, was genau ich vermisse oder ob der Test anders eingerichtet werden muss?

Antwort

0

Import die fehlende rxjs Karte in TodoService

import 'rxjs/add/operator/map';