2017-03-02 7 views
0

私はangular2の初心者です。Angular2 - HTTPコールユニットテスト

私service.tsは

import { TestBed, async, inject } from '@angular/core/testing'; 
import { HomeService } from './home.service'; 
import { BaseRequestOptions, Response, ResponseOptions, Http } from '@angular/http'; 
import { MockBackend, MockConnection } from '@angular/http/testing'; 
import {Observable} from 'rxjs/Observable'; 

describe('FacilityPopupService',() => { 
    let subject: HomeService = null; 
    let backend: MockBackend = null; 
    let userid="UID1"; 

    beforeEach(() => { 
    TestBed.configureTestingModule({ 
     providers: [ 
      HomeService, 
      Response, 
     BaseRequestOptions, 
     MockBackend, 
     { 
      provide: Http, 
      useFactory: (backend: MockBackend, defaultOptions: BaseRequestOptions) => { 
      return new Http(backend, defaultOptions); 
      }, 
      deps: [MockBackend, BaseRequestOptions], 
     } 

      ] 
    }); 
    }); 

    beforeEach(inject([HomeService, MockBackend], (userService: HomeService, mockBackend: MockBackend) => { 
    subject = userService; 
    backend = mockBackend; 

    })); 

    it('get Facility list should call endpoint and return it\'s result', (done) => { 
     backend.connections.subscribe((connection: MockConnection) => { 
      let options = new ResponseOptions({ 
      body: JSON.stringify({ success: true }) 
      }); 
      connection.mockRespond(new Response(options)); 
     }); 

     subject.getUserInfo(userid) 
     .subscribe((response) => { 
      expect(response).toEqual({ success: true }); 
      done(); 
     }); 

    }); 

}); 

は、私は、成功事例とエラーケースの両方のためのテストケースを書きたい、と私はユニットテストケースを書かれている、

import { Injectable } from '@angular/core'; 
import { Http, Response } from '@angular/http'; 
import {Headers, RequestOptions, URLSearchParams} from '@angular/http'; 
import {Observable} from 'rxjs/Observable'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/operator/catch'; 
import 'rxjs/add/observable/throw'; 

@Injectable() 
export class HomeService { 

    url : string; 

    constructor(private _http: Http) {} 

    getUserInfo(userId : string) { 

     this.url = "http://localhost:9080/GetUserData"; 

     let content = new URLSearchParams(); 
     content.set('userId', userId.toString()); 

     let headers = new Headers(); 
     headers.append('Content-Type', 'application/x-www-form-urlencoded'); 

     return this._http 
      .post(this.url, content.toString(), {headers: headers}) 
      .map((res: Response) => res.json()) 
      .catch(this.handleError); 
    } 

    handleError (error: Response | any) { 

     let errMsg: string; 
     if (error instanceof Response) { 
      const body = error.json() || ''; 
      const err = body.error || JSON.stringify(body); 
      errMsg = `${error.status} - ${error.statusText || ''} ${err}`; 
     } else { 
      errMsg = error.message ? error.message : error.toString(); 
     } 
     console.error(errMsg); 
     return Observable.throw(errMsg); 
    } 

} 

になります。私はどのように実行するかわからないブロックをキャッチします。また、handleErrorメソッドのテストケースの記述方法もわかりません。

ここで考えられるすべてのシナリオをカバーすることはできません。 service.tsを100%カバーするために私を助けてください。

+0

をたどることができますか? – BILL

+0

@BILL。質問が更新されました。今すぐご確認ください。 –

答えて

1

ネガティブケースをカバーするために、非200のステータスコードで応答を模擬することができます。 あなたはこの例であなたがカバーしたいん例MockBackend.

it('getUserInfo() while server is down', fakeAsync(() => { 
     let result: any; 
     let catchedError: any; 
     this.userUser.getUserInfo(1) 
      .then((userInfo: any) => result = userInfo) 
      .catch((error: any) => catchedError = error); 
     this.lastConnection.mockRespond(new Response(new ResponseOptions({ 
     status: 404, //here 
     statusText: 'URL not Found', 
     }))); 
     tick(); 
     expect(result).toBeUndefined(); 
     expect(catchedError).toBeDefined(); 
    })); 
}); 
+0

あなたの答案をお寄せいただきありがとうございます...ここにtick()とは何ですか?私はtick()を入れるとコンパイルエラーが出ます。 –

+0

@HumanBeing @ angle/core/testingからtick機能をインポートすることができます – BILL

+0

素晴らしい... _ + 1 for u ...あなたは** component.ts **の問題を調べてください。 http://stackoverflow.com/questions/42814752/angular2-http-call-code-coverage –

0

肯定の場合は、次のコードを使用できます。負のケースでは

describe('HomeService',() =>{ 
    let homeService:HomeService, 
     mockHttp; 

     beforeEach(() => { 
      mockHttp=jasmine.createSpyObject('mockHttp',['get']) 
      homeService=new HomeService(mockHttp); 

     }); 
     describe('GetbyID', =>{ 
      it('should get the detail of user with passed id', =>{ 
      let user={id:1,name:'some Name'} 
       mockHttp.get.and.returnValue(Observable.of(false)); 
       homeService.getUserInfo(1); 
       expect(mockHttp.get).toHaveBeenCalledWith('your url'); 

      }); 
     }); 
}); 

は、URLを間違え、コールが失敗しているとエラーハンドラメソッドが呼び出されているかどうか確認してください。

+0

ネガティブな事件についてのご意見はありますか? –

+0

@HumanBeing答えを更新する – Aravind