0

Observablesとngrxストアを使用するAngular 2サービスをテストしようとしています。私はほとんどのテストを通過しているが、私のテストの1つでは、私は正しく実行していると信じているHTTP呼び出しを模擬しようとしているが、問題は「注入」ステートメントのコードが実際に実行されていないことである。カルマ/ジャスミンテストアンギュラ2サービス内でコードを実行しない

@Injectable() 
export class FirmService { 
    public stateObservable: Observable<FirmState>; 

    constructor(private $http: AuthHttp, private store: Store<FirmState>) { 
    // whatever reducer is selected from the store (in line below) is what the "this.store" refers to in our functions below. 
    // it calls that specific reducer function 
    this.stateObservable = this.store.select('firmReducer'); 
} 

public getFirms(value?: string) { 
    return this.$http.get('/api/firm').map((response: Response) => { 
     this.store.dispatch({ 
      type: firmActions.GET_FIRMS, 
      payload: response.json() 
     }); 
     return; 
    }); 
    } 
} 

getFirmsのための私のテスト: はTypeError:

beforeEach(() => { 
    TestBed.configureTestingModule({ 
     imports: [HttpModule, AppModule], 
     providers: [ 
      { provide: XHRBackend, useClass: MockBackend }, 
      FirmService 
     ] 
    })); 


    // using these mock firms in other tests as well 
    firms = { 
     firms: [ 
      { 
       'name': 'ICBC', 'country': 'United States', 'industry': 'Financial Services', 
       'edfModels': [{ 'name': 'US FIN 4.0', 'QO': false }, { 'name': 'US FIN 4.0', 'QO': true }], 
       'lgdModels': [{ 'name': 'US FIN 4.0', 'QO': false }, { 'name': 'US FIN 4.0', 'QO': true }], 
       'modifiedOn': '1/1/2016', 'modifiedBy': 'John Doe' 
      }, 

      { 
       'name': 'CCBC', 'country': 'United States', 'industry': 'Financial Services', 
       'edfModels': [{ 'name': 'US FIN 4.0', 'QO': false }, { 'name': 'US FIN 4.0', 'QO': true }], 
       'lgdModels': [{ 'name': 'US FIN 4.0', 'QO': false }, { 'name': 'US FIN 4.0', 'QO': true }], 
       'modifiedOn': '1/1/2016', 'modifiedBy': 'John Doe', 'selected': true 
      } 
     ] 
    }; 
}); 

it('getFirms should dispatch the GET_FIRMS action', inject([FirmService, XHRBackend], (firmServiceMock, mockBackend) => { 
    const expectedAction = { 
     type: firmActions.GET_FIRMS, 
     payload: firms 
     }; 

     mockBackend.connections.subscribe((connection) => { 
      connection.mockRespond(new Response(new ResponseOptions({ 
        body: JSON.stringify(firms) 
      }); 
     })); 

     spyOn(mockStore, 'dispatch'); 

     firmServiceMock.getFirms().subscribe(() => { 
      expect(mockStore.dispatch).toHaveBeenCalled(); 
      expect(mockStore.dispatch).toHaveBeenCalledWith(expectedAction); 

     }); 
})); 

誰もが私は私のspecファイルでこのエラーを削除するために何をする必要があるかを教えてもらえます。http.get(...)マップ(... ).toPromiseは関数ではありません。

私のサービスでhttpコールを実行してはいけません。

答えて

1

私は依存関係のすべてを持っていないので、私はこれを確認することはできませんが、beforeEachのようにブロックする前に注入を行う必要があると思います。

+0

ありがとうございました。私はそれを実際の宣言に移動しなければならなかったようです。私のコードを更新しましたが、今はこのエラーが発生しています: "TypeError:http.get(...)。map ... ).toPromiseは "私のfirmServiceMock.getFirms()。subscribe行のコードに到達すると関数ではありません"。私はこの解決策を試みた:https://stackoverflow.com/questions/39121286/angular2-typeerror-this-http-get-topromise-is-not-a-function。しかし、私はエラーが停止しますが、私の購読関数内でコードは実行されないと付け加えます。私もテストしているサービスを追加しました。ありがとう – bschmitty

関連する問題