2016-12-21 18 views
5

@angular/http'a bağlı olan sınama kodu MockBackend kullanıyorum. Bunu denedik, ancak
thoughtram: Testing Services with Http in AngularAçısal: HTTP ile MockBackend'i test etmek, async() gerçekten gerekli midir?

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) 
     }))); 
     }); 
    }))); 
}); 

ve ben MockBackend tamamen senkron yürütür eminim:: web genelinde
Tüm örnekler buradaki gibi, eşzamanlı olmayan bir test kurulumunu kullanmak

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'); 
    })); 
}); 

burada plunker üzerinde tam bir örnek oluşturdu: https://plnkr.co/edit/I3N9zL?p=preview

enter image description here

Bu makaleler yazıldığından beri bir şey değişmiş olmalıdır. Birisi beni bu kırılma değişikliğine işaret edebilir mi? Yoksa önemli bir gerçeği mi özledim?

+0

Testlerin geçirilmesi ve bunların geçerliliğini kaybetmeniz zorunlu olarak yararlı değildir - bir "başarısız" * testini "async" kullanarak alır ve bu çağrıyı kaldırırsanız ne olur? Hala başarısız mı? – jonrsharpe

+0

ilk örnek temel olarak yanlıştır, 'bekliyor (" BU TEST YANLIŞ POZİTİF ") toEqual (false);' asla yeşil olmamalıdır. Kod uyumsuz olarak çalışırsa çalışır. ama artık değil (artık). –

+0

Ben *** mockResponse *** senkronize olduğunu, ancak *** MockConnection *** senkronize görünmüyor. Her sınamaya ikinci bir test ekledim (onu 2 videoya indirdim ve senkronize olanı başarısız oldu ve async geçti). –

cevap

5

Varsayımınız tamamen doğruysa, MockConnection.mockRespond() eşzamanlı olarak yayar. Bu testte async() gerekli değildir.

Sorunuzda başvurduğunuz makalenin sahibiyim ve buna göre güncelledim.

Bunu işaret ettiğin için çok teşekkür ederim!

İlgili konular