2017-01-23 6 views
1

У меня есть услуга Угловая 2, связанная с Угловой функцией Http с Rxjs 5 для подключения к спокойной веб-службе. Вызов getObjects просто возвращает обработанный Json в виде массива Observable значимых объектов. Я пытаюсь получить наблюдаемый, который возвращается, чтобы разрешить с моим издеваемым ответом Http, но я на самом деле не нашел рабочего ответа на это.Rxjs5 Тестирование с углом 2

код теста:

import { getTestBed } from '@angular/core/testing'; 
import { MockBackend } from '@angular/http/testing'; 
import { TestScheduler } from "rxjs"; 

import { expect } from 'chai'; 
import { spy } from 'sinon'; 
import TestingUtilities from "../shared/test.utilities"; 

import Service from './service'; 
import ReturnObject from "../returnobject"; 

describe(`ServiceTests`,() => { 
    let MOCK_DATA: string = ...mocked JSON string response...; 

    let service: Service 
    let backend: MockBackend 
    let scheduler: TestScheduler 

    function assertDeepEqualFrame(actual:any, expected:any) { 
    console.log("test"); 
    if (!expected === actual) { 
     throw new Error('Frames not equal!'); 
    } 
    } 

    beforeEach(() => { 
    TestingUtilities.configureTestingModuleForMockHttp(getTestBed(), function() { 
     return Service 
    }); 

    backend = getTestBed().get(MockBackend); 
    service = getTestBed().get(EarthquakeService); 
    scheduler = new TestScheduler(assertDeepEqualFrame); 
    }); 

    it('should return mocked data',() => { 
    TestingUtilities.mockHttpResponse(backend, MOCK_DATA); 

    let observables = service.getObjects(); 
    scheduler.expectObservable(observables).toBe("", functionToCreateMockObjects()); 
    }); 

В TestingUtilities просто удобство обертка вокруг решения для насмешливых услуг Http предоставляемых угловым, представленных на https://semaphoreci.com/community/tutorials/testing-angular-2-http-services-with-jasmine. Этот код выше компилируется, но на самом деле он, похоже, не возвращает насмешливых Observables и не утверждает ни на что. Я изо всех сил пытаюсь понять, как использовать TestScheduler для вызова существующей службы и получать наблюдаемые данные для проверки. У кого-нибудь есть идеи?

ответ

1

Я не использую TestScheduler для проверки наблюдаемых. Но мне очень нравится следующий подход, который я использую:

import {TestBed, inject} from '@angular/core/testing'; 
import {BaseRequestOptions, Http, HttpModule, ResponseOptions, Response} from '@angular/http'; 
import {MockBackend} from '@angular/http/testing'; 
import {Book} from '../custom-types/book'; 
import {GoogleBooksService, API_PATH_SINGLE_BOOK} from './google-books.service'; 

const mockedHttpProvider = { 
    provide: Http, 
    deps: [MockBackend, BaseRequestOptions], 
    useFactory: (backend: MockBackend, defaultOptions: BaseRequestOptions) => { 
     return new Http(backend, defaultOptions); 
    } 
}; 

describe('Service: GoogleBooks',() => { 
    beforeEach(() => { 
     TestBed.configureTestingModule({ 
      imports: [HttpModule], 
      providers: [ 
       GoogleBooksService, 
       BaseRequestOptions, 
       MockBackend, 
       mockedHttpProvider 
      ], 
     }); 
    }); 

    it('should call the google books api', 
     inject([GoogleBooksService, MockBackend], (service: GoogleBooksService, backend: MockBackend) => { 
      let queryId: string = "someId"; 
      let expectedResponse: Book = { 
       description: 'It's just Angular', 
       title: 'How to test Observables' 
      }; 

      backend.connections.subscribe(connection => { 
       expect(connection.request.url).toBe(API_PATH_SINGLE_BOOK + queryId); 
       let response = new ResponseOptions({body: JSON.stringify(expectedResponse)}); 
       connection.mockRespond(new Response(response)); 
      }); 

      service.getBookByGoogleBookId(queryId).subscribe(response => { 
       expect(response).toEqual(expectedResponse); 
      }) 
     }) 
    ); 
}); 

реализация Услуги:

@Injectable() 
export class GoogleBooksService { 

    constructor(private http: Http) { 
    } 

    getBookByGoogleBookId(id: string): Observable<Book> { 
     return this.http.get(API_PATH + id) 
      .map(res => res.json()); 
    } 
} 
+0

Это, в конечном счете, решение, с которым я пошел. Причиной для моих ошибок был способ, которым я устанавливаю свой класс TestUtilities для обмена издевательством службы Http: я скопировал этот URL, упомянутый выше, и забыл исправить URL-адрес, чтобы быть динамичным. Это оказалось источником всех моих проблем; после фиксации этого, все остальное встало на свои места, просто подписавшись на вывод служебного вызова. Спасибо за сообщение! – Skeeterdrums

0

Попробуйте протестировать свой сервис с издевались бэкэндом таким образом:

describe(`ServiceTests`,() => { 
    let MOCK_DATA: string = ...mocked JSON string response...; 

    let earthquakeService: EarthquakeService; 

    beforeEach(() => { 
    TestBed.configureTestingModule({ 
     providers: [ 
      EarthquakeService, 
      { provide: XHRBackend, useClass: MockBackend }, 
      { provide: ComponentFixtureAutoDetect, useValue: true } 
     ], 
     imports: [ 
      HttpModule 
     ] 
    }) 
    .compileComponents(); 
    }); 
    }); 

    it('should return mocked data', async(inject([ Http, XHRBackend ], (http: Http, backend: MockBackend) => { 
    backend.connections.subscribe((c: MockConnection) => c.mockRespond(response)); 

    let options = new ResponseOptions({ status: 200, body: { data: MOCK_DATA } }); 
    response = new Response(options); 

    earthquakeService = new EarthquakeService(http); 

    earthquakeService.getObjects().subscribe(results => { 
     expect(results).toEqual({ data: MOCK_DATA }); 
    });); 

Это тестирует ваш сервис в изоляции. Тестирование других компонентов, которые используют эту услугу, можно выполнить, расширив этот фрейм или создав в этих тестах исправленную службу.

+0

Это то, что делает оболочка TestUtilities. Я действительно нуждался в блоке подписки с утверждениями внутри. Благодаря! – Skeeterdrums

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

  • Нет связанных вопросов^_^