2016-09-09 8 views
9

तो मैं अपने कोणीय 2 घटकों & सेवाओं का परीक्षण कर रहा हूं।एचटीपी पोस्ट के लिए यूनिट टेस्ट कैसे करें, एंगुलर 2 में मॉकबैकेंड का उपयोग करके हटाएं?

अब तक मैं नीचे के रूप में सेवा में प्राप्त अनुरोध मजाक के लिए mockBackend का इस्तेमाल किया है:

/* tslint:disable:no-unused-variable */ 

import { MockBackend } from '@angular/http/testing'; 
import { Http, ConnectionBackend, BaseRequestOptions, Response, ResponseOptions } from '@angular/http'; 
import { PagesService } from './pages.service'; 
import { tick, fakeAsync } from '@angular/core/testing/fake_async'; 
import { inject, TestBed } from '@angular/core/testing/test_bed'; 
import {GlobalService} from './../../shared/global.service'; 

describe('PagesService',() => { 
    beforeEach(() => { 
    TestBed.configureTestingModule({ 
     providers: [ 
     { 
      provide: Http, useFactory: (backend: ConnectionBackend, defaultOptions: BaseRequestOptions) => { 
      return new Http(backend, defaultOptions); 
      }, deps: [MockBackend, BaseRequestOptions] 
     }, 
     { provide: PagesService, useClass: PagesService }, 
     { provide: GlobalService, useClass: GlobalService }, 
     { provide: MockBackend, useClass: MockBackend }, 
     { provide: BaseRequestOptions, useClass: BaseRequestOptions } 
     ] 
    }); 
    }); 

    //should retrive all search results 
    it('should retrieve all search results', 
    inject([PagesService, MockBackend], fakeAsync((pagesService: PagesService, mockBackend: MockBackend) => { 
     let res: Response; 
     mockBackend.connections.subscribe(c => { 
     expect(c.request.url).toBe('http://localhost:3200/pm/pages/'); 
     let response = new ResponseOptions({ 
      body: '[{"name": "Rapid"}, {"name": "NGBC"}]'}); 
      c.mockRespond(new Response(response)); 
     }); 
     pagesService.getAllpages().subscribe((response) => { 
      res = response;    
     }); 
     tick(); 
     expect(res[0].name).toBe('Rapid'); 
    })) 
); 
it('should fetch by Page id', 
    inject([PagesService, MockBackend], fakeAsync((pagesService: PagesService, mockBackend: MockBackend) => { 
    let res; 
    mockBackend.connections.subscribe(c => { 
     let page_id:string='2'; 
     expect(c.request.url).toBe('http://localhost:3200/pm/pages/'+page_id); 
     let response = new ResponseOptions({body: '[{"id": 1, "name": "Rapid"}, {"id": 2, "name": "NGBC"}]'}); 
     c.mockRespond(new Response(response)); 
    }); 
    pagesService.getPageById('2').subscribe((response) => { 
     res = response; 
    }); 
    tick(); 
    expect(res[1].name).toBe('NGBC'); 
    })) 
); 
}); 

तुम मेरे service.ts इसके नीचे के रूप में देखना चाहते हैं: उपरोक्त सेवा से

export class PagesService { 
    private headers = new Headers(); 
    public baseUrl:string; 
    constructor(private http: Http,private _globalService:GlobalService) { 
     this.baseUrl=this._globalService.baseUrl; 
    } 
    getAllpages() { 
     return this.http.get(this.baseUrl + '/pm/pages/') 
      .map((res: Response) => res.json()).catch(this.handleError); 
    } 

    getPageById(page_id: string) { 
     return this.http.get(this.baseUrl + '/pm/pages/' + page_id) 
      .map((res: Response) => res.json()).catch(this.handleError); 
    } 

    savePage(page: Object) { 
     this.headers=new Headers(); 
     this.headers.append('Content-Type', 'application/json'); 
     let url = this.baseUrl+'/pm/pages/'; 
     let data={}; 
     data["data"]=page; 
     return this.http.post(url, JSON.stringify(data),{headers: this.headers}) 
      .map((res: Response) => res.json()).catch(this.handleError); 
    } 

    updatePage(page: any) { 
     this.headers=new Headers(); 
     this.headers.append('Content-Type', 'application/json'); 
     let url = this.baseUrl+'/pm/pages/'+page._id; 
     let data={}; 
     data["data"]=page; 
     return this.http.put(url, JSON.stringify(data),{headers: this.headers}) 
      .map((res: Response) => res).catch(this.handleError); 
    } 

    deletePage(page_id: string) { 
     this.headers=new Headers(); 
     this.headers.append('Content-Type', 'application/json'); 
     let url = this.baseUrl+'/pm/pages/'; 
     return this.http.delete(url + page_id,{headers: this.headers,body: ''}) 
      .map((res: Response) => res).catch(this.handleError); 
    } 

    mergePage(page: Object) { 
     return this.http.post(this.baseUrl + '/pm/pages/',JSON.stringify(page)) 
      .map((res: Response) => res.json()).catch(this.handleError); 
    } 

    handleError(error: any) { 
     console.error(error); 
     return Observable.throw(error.json().error || 'Server error'); 
    } 
} 

, मैंने getAllPages() & getPageById() विधियों को मेरी service.spec.ts फ़ाइल में सही तरीके से कार्यान्वित किया है क्योंकि वे ठीक काम कर रहे हैं।

मैं जानना चाहता हूं कि savePage() , updatePage() , deletePage() विधियों के लिए परीक्षण मामलों को कैसे कार्यान्वित किया जाए।

कोई इनपुट?

अग्रिम धन्यवाद।

उत्तर

3

आपको विधियों के आंतरिक परीक्षणों की जांच करने और यह देखने की आवश्यकता है कि यह क्या कर रहा है। इस प्रकार आप इसकी अपेक्षित व्यवहार का परीक्षण करते हैं।

  • आप सामग्री-प्रकार शीर्षलेख सेट कर रहे हैं। तो यह एक आवश्यकता है, और आपको इस व्यवहार का परीक्षण करना चाहिए। आप MockConnection#request

    backend.connections.subscribe((conn: MockConnection) => { 
        let contentType = conn.request.headers.get('Content-Type'); 
        expect(contentType).not.toBeNull(); 
        expect(contentType).toEqual('application/json'); 
    }); 
    
  • आप URL स्थापित कर रहे हैं के हेडर प्राप्त कर सकते हैं, तो यह एक आवश्यकता है। इसका परीक्षण किया जाना चाहिए। आप पहले से ही

    expect(conn.request.url).toBe('...'); 
    
  • आप डेटा भेज रहे हैं। तो यह एक आवश्यकता है। आपको यह सुनिश्चित करना डेटा आवश्यक प्रारूप/संरचना

    let body = conn.request.json(); 
    expect(body.data).toEqual('page'); 
    

अनुरोध भाग के लिए है कि में है बनाने के लिए परीक्षण करना चाहिए।

प्रतिक्रिया भाग के लिए, आपको परीक्षण करना चाहिए कि आपकी प्रतिक्रिया उस प्रतिक्रिया के साथ क्या करती है।

  • यदि आप शरीर प्राप्त कर रहे हैं, तो आपको इसका परीक्षण करना चाहिए जैसे आपने जीईटी अनुरोध के साथ किया था।

  • आप त्रुटि कॉलबैक के साथ त्रुटि को भी संभालने में हैं। आपको यह जांचने की आवश्यकता नहीं है कि कॉल वापस क्या करता है। यह स्वयं का परीक्षण होना चाहिए। हम परीक्षण करना चाहते हैं कि एरर हैंडल को परीक्षण के तरीके से बुलाया जाता है। इसके लिए हमें एक जासूस का उपयोग करना चाहिए। हम handleError फ़ंक्शन में जासूसी कर सकते हैं, और फिर जांचें कि इसे कॉल किया गया है।

    spyOn(service, 'handleError').and.callFake(() => {}); 
    // make call 
    tick(); 
    expect(service.handleError).toHaveBeenCalled(); 
    

    मैं एक मामले (MockConnection का प्रयोग करके) जहां catch विधि अपने HTTP अनुरोध पर कहा जाता है नहीं मिल सकता है, यही कारण है कि मैं एक उदाहरण पोस्ट नहीं किए जा रहे हैं। मैंने conn.mockError(new Error()) की कोशिश की, यह काम नहीं किया। मैंने कनेक्शन के अंदर एक त्रुटि फेंकने की कोशिश की, यह काम नहीं किया। शायद आप इसे समझ सकते हैं।

संबंधित मुद्दे