2016-12-01 2 views
1

Я хочу написать несколько тестов для моей службы, написанной в угловых 2.1.0:Angular2 Тестирование: Служба возвращение функции вместо массива объектов

@Injectable() 
export class MyService { 
    api_base_url = 'http://' + environment.apiHost + ':5000/api/'; 

    constructor(private http: Http) { 
    } 

    getMyObjs(query): Observable<MyObj[]> { 
     let params = new URLSearchParams(); 

     if (query != null && query.length > 0) 
      params.set('q', query); 

     return this.http.get(this.api_base_url + 'entries/' + pipelineId, {search: params}) 
      .map(this.extractData) 
      .catch(this.handleError); 
    } 

    private extractData(res: Response) { 
     let body = res.json(); 
     return body.entries || {}; 
    } 

    private handleError(error: any) { 
     // In a real world app, we might use a remote logging infrastructure 
     // We'd also dig deeper into the error to get a better message 
     let errMsg = (error.message) ? error.message : 
      error.status ? `${error.status} - ${error.statusText}` : 'Server error'; 
     console.error(errMsg); // log to console instead 
     return Observable.throw(errMsg); 
    } 

} 

А вот тест до сих пор:

describe('Service: Entry',() => { 

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

})); 

it('should return myobjs', inject([MockBackend, MyService], (backend: MockBackend, service: MyService) => { 
    const my_body = JSON.stringify([ 
     { 
      "timestamp": "2016.01.01T12:55:00Z", 
      "level": 0, 
     } 
    ]); 
    const baseResponse = new Response(new ResponseOptions({body: my_body, status: 200})) 
    backend.connections.subscribe((connection: MockConnection) => { 
     return connection.mockRespond(baseResponse); 
    }); 

    service.getMyObjs(null).subscribe((obs: MyObj[]) => { 
     console.log(obs); 
     expect(obs.length).toBe(1); 
    }); 

})); 
}); 

Этот тест не отвечает Expected 0 to be 1.. На панели console.log отображается LOG: function obs() { ... }. Я не понимаю, почему это функция, а не массив объектов. Я запускаю тесты командой ng test.

ответ

1

В издеваемом HTTP-ответе вы возвращаете структуру объекта, которая отличается от того, что ожидает extractData(). Я полагаю, это должно выглядеть так:

// ... stuff ... 
it('should return myobjs', ...) => { 
    const my_body = JSON.stringify({ 
     entries: [{ 
      "timestamp": "2016.01.01T12:55:00Z", 
      "level": 0, 
     }] 
    }); 
+0

Вы просто сохраните мой день. – fivunlm

Смежные вопросы