2017-01-19 4 views
2

Я пытаюсь написать единичный тест для моей службы с использованием MockBackend и каждый раз, когда я получаю ответ как неопределенный. Любая помощь будет оценена по достоинству. Я проверил все эти решения ниже и по сравнению с моими, я действительно не вижу больших различий.Угловой 2: MockBackend возвращает ответ «undefined»

Вот моя служба:

import { Injectable } from '@angular/core'; 
import { Http } from '@angular/http'; 
import { SomeObject } from './someObject'; 

@Injectable() 
export class SomeService { 

    private serviceUrl: string = 'http://localhost:8080/getObjects'; 

    constructor(private http: Http) { } 

    getObjects() { 
     return this.http.get(this.serviceUrl) 
      .map((response) => response.json().content as SomeObject[]) 
    } 
} 

Вот мои тесты:

import { Http, BaseRequestOptions, Response, ResponseOptions } from '@angular/http'; 
import { TestBed, tick, fakeAsync, inject } from '@angular/core/testing'; 
import { MockBackend } from '@angular/http/testing'; 
import { SomeService } from './some.service'; 
import { SomeObject } from './someObject'; 

describe('SomeServiceTest',() => { 

    let stubData: SomeObject[] = [ 
     new SomeObject(1, "Title") 
    ]; 

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

    it('should fetch data', inject([SomeService, MockBackend], fakeAsync((service: SomeService, mockBackend: MockBackend) => { 
     let res: SomeObject[]; 
     mockBackend.connections.subscribe(c => { 
      expect(c.request.url).toBe('http://localhost:8080/getObjects'); 
      c.mockRespond(new Response(new ResponseOptions({ 
       body: JSON.stringify(stubData) 
      }))); 
     }); 

     service.getObjects().subscribe((response) => { 
      console.log("response :: " + JSON.stringify(response)); // this is where I am seeing undefined 
      res = response; 
     }); 

     tick(); 

     expect(res[0].name).toBe('Title'); // this returns an exception TypeError: Cannot read property '0' of undefined 
    }))); 
}); 

ответ

4

Я мог бы быть неправильно, но я believ e ваша проблема, во-первых, что вы возвращаете response.json().content as Object[] от вашего сервиса. content свойство, скорее всего, не определено. Я бы предложил просто сопоставить ваш ответ на объект json и обработать его компонент.

getObjects() { 
    return this.http.get(this.dealsUrl) 
     .map((response) => response.json()); 
} 

Затем

service.getSomeObjectsUsingObservable().subscribe((response) => { 
    console.log("response :: " + JSON.stringify(response)); 
    if (response.content){ 
     res = response as SomeObject[]; 
    } 
    else { 
     //- fail test 
    } 
}); 
tick(); 
expect(res[0].name).toBe('Title'); 

Надежда это помогает

+1

Крепление ответ от 'response.json(). Содержание в SomeObject []' 'к response.json()' решить ее. Вторая исправленная вами проблема не является проблемой, так как вы можете видеть, что я использовал 'fakeAsync' в сочетании с' tick() ', который обрабатывает мои асинхронные вызовы. Тем не менее, я все равно буду принимать этот ответ как правильный. – Sayantan

+0

О, я вижу, я обновлю свой ответ для дальнейшего использования! Рад, что я смог помочь. –

+0

Большое спасибо Даниил !! Всегда помогает второй набор глаз. Я знал, что в конфигурации нет ничего плохого, и за ними всегда бывает глупая ошибка;) – Sayantan

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