2017-06-20 26 views
1

シンプルなサービス取得メソッドの単体テストで非常に奇妙な問題が発生しています。私はAngular 4とcliを使ってカルマ/ジャスミンをテストしています。ユニットテストでsubscribeメソッドにアクセスできない

マイサービス方法:

getAccounts(): Observable<ApiData> { 
    return this.authHttp.get('../../assets/mock_data/productsOverview.json') 
     .map(
     data => { 
      return JSON.parse(data['_body']); 
     }, 
     err => { 
      return err; 
     } 
    ); 
    } 

そして、ここでは、私のテストケースである:

import { TestBed, inject, async } from '@angular/core/testing'; 
import { Http, BaseRequestOptions, RequestOptions, HttpModule, ConnectionBackend } from '@angular/http'; 
import { MockBackend, MockConnection } from '@angular/http/testing'; 
import { AuthHttp, AuthConfig } from 'angular2-jwt'; 
import { encodeTestToken } from 'angular2-jwt/angular2-jwt-test-helpers'; 
import { AppModule } from '../app.module'; 
import { PersonalAccountsService, ApiData } from './personal-accounts.service'; 
import { Observable } from 'rxjs/Observable'; 

export function authHttpServiceFactory(http: Http, options: RequestOptions) { 
    return new AuthHttp(new AuthConfig({ 
    headerName: 'Authorization', 
    headerPrefix: 'Bearer', 
    tokenName: 'token', 
    tokenGetter: (() => localStorage.getItem('token')), 
    globalHeaders: [ 
     { 'Content-Type': 'application/json' }, 
     { 'Ocp-Apim-Subscription-Key': localStorage.getItem('key') }], 
    }), http, options); 
} 

const MyMockedService = { 
    method:() => { } 
} 

describe('PersonalAccountsService',() => { 

    beforeEach(() => { 
    TestBed.configureTestingModule({ 
     providers: [ 
     PersonalAccountsService, 
     BaseRequestOptions, 
     MockBackend, 
     { 
      provide: Http, 
      useFactory: (mockBackend: MockBackend, defaultOptions: BaseRequestOptions) => { 
      return new Http(mockBackend, defaultOptions); 
      }, 
      deps: [MockBackend, BaseRequestOptions], 
     }, 
     { 
      provide: AuthHttp, 
      useFactory: (http) => { 
      return new AuthHttp(new AuthConfig({ 
       tokenName: 'token', 
       tokenGetter: (() => encodeTestToken(this)), 
       globalHeaders: [{ 'Content-Type': 'application/json' }] 
      }), http); 
      }, 
      deps: [Http], 
     }, 
     ], 
     imports: [ 
     HttpModule 
     ], 
    }); 
    }); 

    it('should be created', inject([PersonalAccountsService], 
    (service: PersonalAccountsService) => { 
     expect(service).toBeTruthy(); 
    })); 

    it('identification', async(
     inject(
      [PersonalAccountsService], 
      (service: PersonalAccountsService) => { 
       console.log('ENTERS HERE'); 
       service.getAccounts().subscribe(
        data => { 
         console.log('NOT ENTERING HERE'); 
        }, 
        err => { 
         console.log('NOT ENTERING HERE'); 
        }, 
        () => { 
         console.log('NOT ENTERING HERE') 
        } 
       ); 
      } 
     ) 
    )); 
}); 

これが起こっているのはなぜ?私は長い間それを理解しようとしており、さらに深く掘り下げてもエラーにはなりません。

+0

はauthHttp何ですか?テストのセットアップとは何ですか? http://stackoverflow.com/help/mcveを提供してください。 – estus

+0

@estus authHttpはトークンを検証するヘルパーです。私がそれを使うかどうかはテスト反応を変えない。私はあなたのために私の質問を更新しました。 –

+0

あなたはMockBackendを使っていますが、実行すべき要求を嘲笑しているわけではありません。単体テストには可動部品が多すぎます。できるだけ孤立した状態にしておくことをお勧めします。テスト。 authHttpを希望の観測値を返すモックで置き換えることを検討してください。 – estus

答えて

0

テストでは、要求が実行される可能性がありますが、MockBackendで嘲笑されませんでした。

コードが第三者サービス(AuthHttp)に依存しているという事実は、単体テストではなく統合テストになります。

できるだけ孤立した状態に保つために、テストされたユニット以外のすべてのユニットをモックまたはスタブする必要があります。サービスin isolation(この場合はDIがテストされていない)、またはTestBedとをテストすることができます。

beforeEach(() => { 
    const authHttpMock = jasmine.createSpyObj('authHttp', ['get']); 
    TestBed.configureTestingModule({ 
    providers: [ 
     { provide: AuthHttp, useValue: authHttpMock } 
     ... 
}); 

it('...', async(inject([PersonalAccountsService, AuthHttp], async (service, authHttpMock) => { 
    const responseMock = Observable.of({ _body: ... }); 
    authHttpMock.get.and.returnValue(responseMock); 

    const accounts$ = service.getAccounts(); 

    expect(authHttpMock.get).toHaveBeenCalledWith(...); 

    const accounts = await accounts$.toPromise(); 

    expect(accounts)... 
    ... 
関連する問題