2016-10-20 7 views
3

Я очень смущен различными источниками в Интернете о тестировании Angular2, в основном из-за различий в версиях. Я использую Угловая 2.1.0 окончательное, и я не понимаю, как издеваться простой ответ HTTP для моей службы тестового класса ниже:UnitTest Mock Http response в Angular2 (2.1.0) Service

import { TestBed, async, inject } from '@angular/core/testing'; 
import { PersonService } from '../services/person.service'; 
import { Person} from '../models/Person'; 
import { MOCK_DATA_PERSON } from '../test/mocks/mock-data-person'; 

// HTTP mocking imports 
import { Http, BaseRequestOptions, Response, HttpModule, ResponseOptions } from '@angular/http'; 
import { MockBackend, MockConnection } from '@angular/http/testing'; 


describe('PersonService',() => { 
    beforeEach(async(() => { 
     TestBed.configureTestingModule({ 
      providers: [ 
       PersonService, 
       MockBackend, 
       BaseRequestOptions, 
       { 
        provide: Http, 
        useFactory: (backend: MockBackend, options: BaseRequestOptions) => { 
         return new Http(backend, options); 
        }, 
        deps: [MockBackend, BaseRequestOptions], 
       } 
      ], 
      imports: [ 
       HttpModule 
      ] 
     }); 

     TestBed.compileComponents(); 
    })); 

    it('returns a list of persons', async(inject([MockBackend, PersonService], (backend: MockBackend, service) => { 

     backend.connections.subscribe(
      (connection: MockConnection) => { 
       connection.mockRespond(new Response(
        new ResponseOptions({ 
         body: JSON.stringify({name: "Bob", surname : "Jones"}) 
        }))); 
      }); 

     service.getPersons() 
      .subscribe(persons=> { 
       expect(persons.length).toBeDefined(); 
       expect(persons.length).toBe(1); 
      }).catch(error => console.log(error)); 
    }))); 


}); 

данный метод getPersons выглядит как:

getPersons(): Observable<Person[]> { 
    return this.http.get(this.getAllUrl) 
     .map(res.json().data) 
     .catch(this.handleError); 
    } 

я я получаю ошибку "Failed: this.http.get(...).map is not a function"

ответ

2

Тест хороший, но оператор Observable.map не найден. Попробуйте просто импортировать его

import 'rxjs/add/operator/map'; 
import 'rxjs/add/operator/catch'; 
+0

Хорошо, вы правы, но 'map' был импортирован в' person.service.ts', так что я не понимаю, почему я должен импортировать его в 'человека. service.spec.ts' ... – nuvio

+1

Я тоже. Это случается со мной также спорадически: -/Я просто импортирую его, чтобы сделать его счастливым. Я уверен, что есть объяснение (и разрешение), но я просто решил сдаться. –