2016-12-21 2 views
5

Я использую MockBackend для проверки кода, который зависит от @angular/http.
Все примеры вокруг сети используют асинхронный испытательную установку, как здесь:
thoughtram: Testing Services with Http in AngularУгловое: тестирование HTTP с помощью MockBackend, асинхронно() действительно требуется?

describe('getVideos()',() => { 

    it('should return an Observable<Array<Video>>', 
     async(inject([VideoService, MockBackend], (videoService, mockBackend) => { 

     videoService.getVideos().subscribe((videos) => { 
     expect(videos.length).toBe(4); 
     expect(videos[0].name).toEqual('Video 0'); 
     expect(videos[1].name).toEqual('Video 1'); 
     expect(videos[2].name).toEqual('Video 2'); 
     expect(videos[3].name).toEqual('Video 3'); 

     expect("THIS TEST IS FALSE POSITIVE").toEqual(false); 
     }); 

     const mockResponse = { 
     data: [ 
      { id: 0, name: 'Video 0' }, 
      { id: 1, name: 'Video 1' }, 
      { id: 2, name: 'Video 2' }, 
      { id: 3, name: 'Video 3' } 
     ] 
     }; 

     mockBackend.connections.subscribe((connection) => { 
     connection.mockRespond(new Response(new ResponseOptions({ 
      body: JSON.stringify(mockResponse) 
     }))); 
     }); 
    }))); 
}); 

Однако, я попробовал, что, и я уверен, что MockBackend выполняет полностью синхронны:

describe('getVideos()',() => { 

    it('should return an Observable<Array<Video>>', 
    inject([VideoService, MockBackend], (videoService, mockBackend) => { 

     const mockResponse = { 
     data: [ 
      { id: 0, name: 'Video 0' }, 
      { id: 1, name: 'Video 1' }, 
      { id: 2, name: 'Video 2' }, 
      { id: 3, name: 'Video 3' }, 
     ] 
     }; 

     mockBackend.connections.subscribe((connection) => { 
     connection.mockRespond(new Response(new ResponseOptions({ 
      body: JSON.stringify(mockResponse) 
     }))); 
     }); 

     let videos; 
     videoService.getVideos().subscribe(v => videos = v); 

     // synchronous code!? 
     expect(videos.length).toBe(4); 
     expect(videos[0].name).toEqual('Video 0'); 
     expect(videos[1].name).toEqual('Video 1'); 
     expect(videos[2].name).toEqual('Video 2'); 
     expect(videos[3].name).toEqual('Video 3'); 
    })); 
}); 

Я создал полный пример на plunker здесь: https://plnkr.co/edit/I3N9zL?p=preview

enter image description here

Что-то, должно быть, было изменено с тех пор, как были написаны эти статьи. Может ли кто-нибудь указать мне на это нарушение? Или я пропустил важный факт?

+0

Изменение тестовых проходов и передача их по-прежнему не всегда полезны. Что произойдет, если вы выполните тест * failing * с использованием 'async' и удалите этот вызов? Он все еще терпит неудачу? – jonrsharpe

+0

Первый пример в основном неправильный, 'ожидать (« ЭТО ТЕСТИРОВАНИЕ ЛОЖНО ПОЗИТИВНО »). ToEqual (false);' никогда не должно быть зеленым. он будет работать, если код будет работать async. но это не так. –

+0

Я предлагаю, чтобы *** mockResponse *** был синхронным, но *** MockConnection *** не кажется синхронным. Я добавил второй тест для каждого теста (уменьшив его до 2-х видео, а синхронный с ошибкой и асинхронный переход. –

ответ

5

Вы совершенно правы с вашего предположения, что MockConnection.mockRespond() испускает синхронно. async() не требуется в данном конкретном тесте.

Я автор статьи, о которой вы говорили в своем вопросе, и я обновил ее соответствующим образом.

Большое спасибо за указание этого!

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