2016-04-08 9 views
2

は私がサービスを持っていますgetAutenticate()メソッド。どのように私はそのHttp(モックアップ対本当のレストサービス)を注入する必要はありません。ここに私の出発点があります:基本サービス・テスト

import { it, describe, expect, inject, beforeEachProviders} from 'angular2/testing'; 
import {Http} from 'angular2/http'; 
import { LoginService } from './login.service'; 

class MockLoginService extends LoginService { 
    // todo something 
} 

describe('login service',() => { 
    beforeEachProviders(() => [ 
     provide(TestService, {useClass: MockLoginService}), Http 
    ]); 

    // beforeEachProviders(() => [LoginService, Http]); 
    it('should find credentials', inject([LoginService], (myService:MockLoginService) => { 
     console.log('HERE ', myService.getAutenticate('user1', 'pass1')); 
     expect(true).toBe(true); 
    })); 
}); 

何が良いアプローチでしょうか?

答えて

4

実際にLoginServiceをテストするには、サービス自体ではなく依存関係をモックする必要があります。この場合、XHRBackendクラスをMockBackendクラスに置き換える必要があります。

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

その後、あなたはXHRBackendを注入し、要求をインターセプトし、独自の応答を返すために、そのconnectionsプロパティで購読することができます。ここで

は、サービスとサンプルがHttpServiceと呼ばれる:

it('test HTTP service', inject([XHRBackend, HttpService, Injector], (mockBackend, httpService, injector) => { 
    mockBackend.connections.subscribe(
     (connection: MockConnection) => { 
      connection.mockRespond(new Response(
       new ResponseOptions({ 
        body: ['some content'] 
       }))); 
    }); 

    httpService.getMethod().subscribe(
     items => { 
      expect(items).toEqual(['test']); 
     }, 
     () => { 
      console.log('error'); 
     }); 
})); 

HttpServiceには、次のことができます:

@Injectable() 
export class HttpService { 
    constructor(private http:Http) { 
    } 

    getMethod() { 
    return this.http.get('/test').map(res => res.json()); 
    } 
} 
+0

が再びありがとう、ティエリーは、私はあなたの例を試してみました:問題は、私が取得することですエラー:失敗:httpService.getMethodは関数ではありません... –

+0

あなたの 'HttpService'クラスに' getMethod'メソッドがありますか? –

+1

私は何をしたのか分かりませんが、あなたの答えに基づいて、https://github.com/krimple/angular2-webpack-demo-routing-and-httpを試しました。私は同じ問題を抱えていた。それから私はサービスを見て、そこにインポートがあることに気づきました。 'rxjs/add/operator/map'をインポートします。私はそれをサービスに加えて働きました! –

関連する問題