2017-01-19 5 views
2

MockBackendを使用して私のサービスの単体テストを書き留めようとしています。どんな助けもありがとう。 私はこれらのすべてのソリューションを以下にチェックして、私と比較すると、私は本当に大きな違いは見られません。ここで 角2:MockBackendが「未定義」応答を返す

import { Injectable } from '@angular/core'; 
import { Http } from '@angular/http'; 
import { SomeObject } from './someObject'; 

@Injectable() 
export class SomeService { 

    private serviceUrl: string = 'http://localhost:8080/getObjects'; 

    constructor(private http: Http) { } 

    getObjects() { 
     return this.http.get(this.serviceUrl) 
      .map((response) => response.json().content as SomeObject[]) 
    } 
} 

は私のテストである:ここで

  • How to use MockBackend in Angular2
    • Test Angular2 service with mock backendは私のサービスです

      import { Http, BaseRequestOptions, Response, ResponseOptions } from '@angular/http'; 
      import { TestBed, tick, fakeAsync, inject } from '@angular/core/testing'; 
      import { MockBackend } from '@angular/http/testing'; 
      import { SomeService } from './some.service'; 
      import { SomeObject } from './someObject'; 
      
      describe('SomeServiceTest',() => { 
      
          let stubData: SomeObject[] = [ 
           new SomeObject(1, "Title") 
          ]; 
      
          beforeEach(() => { 
           TestBed.configureTestingModule({ 
            providers: [ 
             SomeService, 
             MockBackend, 
             BaseRequestOptions, 
             { 
              provide: Http, 
              useFactory: (backend: MockBackend, options: BaseRequestOptions) => { 
               return new Http(backend, options); 
              }, 
              deps: [MockBackend, BaseRequestOptions] 
             } 
            ] 
           }); 
          }); 
      
          it('should fetch data', inject([SomeService, MockBackend], fakeAsync((service: SomeService, mockBackend: MockBackend) => { 
           let res: SomeObject[]; 
           mockBackend.connections.subscribe(c => { 
            expect(c.request.url).toBe('http://localhost:8080/getObjects'); 
            c.mockRespond(new Response(new ResponseOptions({ 
             body: JSON.stringify(stubData) 
            }))); 
           }); 
      
           service.getObjects().subscribe((response) => { 
            console.log("response :: " + JSON.stringify(response)); // this is where I am seeing undefined 
            res = response; 
           }); 
      
           tick(); 
      
           expect(res[0].name).toBe('Title'); // this returns an exception TypeError: Cannot read property '0' of undefined 
          }))); 
      }); 
      

    答えて

    4

    私は間違っているかもしれないが、私はbelievあなたの問題は、最初にあなたのサービスからresponse.json().content as Object[]を返すことです。contentプロパティは、おそらく定義されていません。あなたの応答をjsonオブジェクトにマッピングし、コンポーネントがそれを処理することをお勧めします。

    getObjects() { 
        return this.http.get(this.dealsUrl) 
         .map((response) => response.json()); 
    } 
    

    そして

    service.getSomeObjectsUsingObservable().subscribe((response) => { 
        console.log("response :: " + JSON.stringify(response)); 
        if (response.content){ 
         res = response as SomeObject[]; 
        } 
        else { 
         //- fail test 
        } 
    }); 
    tick(); 
    expect(res[0].name).toBe('Title'); 
    

    これは) `response.json(からの応答を修正

    +1

    を助ける希望。コンテンツSomeObjectのは[]')(response.json ''にそれを解決しました。 私が非同期呼び出しを処理する 'tick()'と一緒に 'fakeAsync'を使用しているのを見れば、あなたが提案した2番目の修正は本当に問題ではありません。 しかし、私はこの答えを正しいものとして受け入れます。 – Sayantan

    +0

    ああ、私は将来の参照のために私の答えを更新するよ!私は喜んで助けてくれました。 –

    +0

    ありがとうダニエル!!目の第二のセットは常に助けます。私は設定に間違いがないことを知っていたし、これらの背後にはいつも愚かな間違いがある;) – Sayantan

    関連する問題