2016-05-30 3 views
6

Httpget()で返された応答を模擬する最も簡単な方法は、角2ですか?角2モックHttp get()でローカルのjsonファイルを返す

ローカルディレクトリdata.jsonが作業ディレクトリにあり、残りのapiをシミュレートするペイロードとしてそのデータを含むレスポンスを返すようにします。

Backendオブジェクトを設定するためのドキュメントは、このような単純な作業のためにやや不明瞭で複雑すぎます。

+0

「バックエンド」の設定がわかりにくいとは考えられません。 DIはAngular2の主要な基本ブロックです。これはまさにDIが作られたユースケースです。 'MockBackend、は(XHRBackend、{useExisting:MockBackend})を提供すると複雑になる。それは簡単で簡単です。 –

+0

@GünterZöchbauerソフトウェアエンジニアは様々です。ちょうど何かが上位50パーセンタイルでは簡単なので、底面50のために簡単にはなりません。実際に自分の靴に着用せずに別の人のPOVを無視することは決してうまくありません。 –

+1

@KaMokコメントは受け付けられません。誰かが解決策を求めている場合、彼は問題の内容に関する情報を提供する必要があります。それが私のコメントです。 「Http用のバックエンドオブジェクトを設定するためのドキュメントは、あまりにも単純で、単純な作業のために複雑すぎるように見えました。ちょうど役に立たない怒鳴りです。もし彼がリンクを提供していたり​​、複雑すぎると判明したコードを投稿した場合は、議論すべきことがあったが、それは本当に問題ではない。私はちょうどより多くの情報を得ることを試みた。 –

答えて

2

XhrBackendプロバイダをMockBackendプロバイダで上書きする必要があります。真のHTTP要求を実行できるように、別のインジェクタを作成する必要があります。ここで

はサンプルです:

beforeEachProviders(() => { 
    return [ 
    HTTP_PROVIDERS, 
    provide(XHRBackend, { useClass: MockBackend }), 
    SomeHttpService 
    ]; 
}); 

it('Should something', inject([XHRBackend, SomeHttpService], (mockBackend, httpService) => { 
    mockBackend.connections.subscribe(
    (connection: MockConnection) => { 
     var injector = ReflectiveInjector.resolveAndCreate([ 
     HTTP_PROVIDERS 
     ]); 
     var http = injector.get(Http); 
     http.get('data.json').map(res => res.json()).subscribe(data) => { 
     connection.mockRespond(new Response(
      new ResponseOptions({ 
      body: data 
      }))); 
     }); 
    }); 
})); 
+1

調査の結果、私はもっと簡単に答えることができました.HTMLアドレスの代わりにURLとしてローカルjsonファイル(app/data.json)の場所を使用してください。 –

+0

素晴らしい!より多くの詳細を持っていることに興味があります;-)リクエストは実際にどのように実行されますか? –

+0

@ThierryTemplierリクエストは実サーバからのGETリクエストと同じように実行されますが、成功しなかったリクエストやMUTEENDを必要とするリクエストに対する動作をテストするなど、より微妙な手順が必要です。 –

1

ところで、あなたはXHRBackendを模擬し、createDbメソッドを持つクラスで嘲笑のデータを提供する必要があります。 createDbメソッドは、模擬JSONオブジェクトを返します。たとえば、JSONオブジェクトが変数mockedObjectに含まれている場合は、"app\mockedObject"になります。たとえば、URLhttp.getのデータをロードするには、正しいデータをロードします。

現在地の詳細を読むことができます:https://angular.io/docs/ts/latest/guide/server-communication.html.

0

は、あなたは私に、コアテストベッドを介して利用HttpTestingControllerを使用することができ、それがより直感的に感じている(もちろん、独自にそれぞれを、)。テストされていないスニペット:

import { TestBed, async } from '@angular/core/testing'; 
import { HttpTestingController } from '@angular/common/http/testing'; 

import { MyApiService } from './my-api.service'; 

export function main() { 
    describe('Test set',() => { 
    let httpMock: HttpTestingController; 

    beforeEach(() => { 

     TestBed.configureTestingModule({ 
     imports: [], 
     providers: [MyApiService] 
     }); 

     httpMock = TestBed.get(HttpTestingController); 
    }); 

    it('should call get', async(() => { 

     const data: any = {mydata: 'test'}; 
     let actualResponse: any = null; 
     MyApiService.get().subscribe((response: any) => { 
     actualResponse = response; 
     }); 

     httpMock.expectOne('localhost:5555/my-path').flush(data); 
     expect(actualResponse).toEqual(data); 

    })); 
    }); 
}