Angular 2 Http-тестирование нескольких соединений

Может кто-нибудь помочь мне с тестированием Http-запросов в Angular 2. У меня есть служба, которая получает поток из двух HTTP-запросов. Как я оцениваю это поведение в своем тесте?

loadData() {
    return Observable.forkJoin(
        this.http.get('file1.json').map((res:Response) => res.json()),
        this.http.get('file2.json').map((res:Response) => res.json())
    ).map(data => {
        return {
            x: data[0],
            y: data[1]
        }
    });
}

Вот мой тестовый код, я попытался использовать массив соединений, но получаю сообщение об ошибке "Ошибка: соединение уже разрешено". Я оставил тело соединений пустым, чтобы не подвергать конфиденциальные данные.

describe('Test Load Init Data', () => {
    it('should load Menu Zones and Menu Sections',
        inject([XHRBackend, AppInitService], (mockBackend, appInitService) => {
            console.log('Lets do some testing');

            //first we register a mock response
            mockBackend.connections.subscribe(
                (connection:MockConnection) => {
                    return [
                        connection.mockRespond(new Response(
                            new ResponseOptions({
                                body: []
                            })
                        )),
                        connection.mockRespond(new Response(
                            new ResponseOptions({
                                body: []
                            })
                        ))
                    ];
                });

            appInitService.loadData().subscribe(data => {
                expect(data.x.length).toBeGreaterThan(0);
                expect(data.y.length).toBeGreaterThan(0);
            });
        }));
});

Ответ 1

У меня была аналогичная проблема с последовательностью запросов. Но сначала на ваш вопрос.

Несколько запросов с разными адресами

var responses = {};
responses['data1.json'] = new Response(new ResponseOptions({body: 'data1'}));
responses['data2.json'] = new Response(new ResponseOptions({body: 'data2'}));

backend.connections.subscribe(connection => {
    var response = responses[connection.request.url];
    connection.mockRespond(response);
});

http.request('data2.json').subscribe(res => expect(res.text()).toBe('data2'));
http.request('data1.json').subscribe(res => expect(res.text()).toBe('data1'));

Последовательность запроса с одинаковым адресом

var responses = [];
responses.push(new Response(new ResponseOptions({body: '1st'})));
responses.push(new Response(new ResponseOptions({body: '2nd'})));

backend.connections.subscribe(connection => {
    var response = responses.shift();
    connection.mockRespond(response);
});

http.request('data.json').subscribe(res => expect(res.text()).toBe('1st'));
http.request('data.json').subscribe(res => expect(res.text()).toBe('2nd'));

Моя реализация выполняется в javascript, но очень легко переносить на тест typescript.

Ответ 2

На самом деле вам нужно высмеять только один ответ в подписанном обратном вызове, но возвращаемый ответ может быть различным в соответствии с URL-адресом запроса:

mockBackend.connections.subscribe(
  (connection: MockConnection) => {
    if (connection.request.url === 'file1.json') {
      connection.mockRespond(new Response(
        new ResponseOptions({
          body: ['some message']
        })));
    } else {
      connection.mockRespond(new Response(
        new ResponseOptions({
          body: ['some other message']
        })));
    }
  });