2016-09-21 10 views
3

まず、プライベートメソッドをテストするべきではないことを理解していますが、ロジックに基づいてプライベートメソッドが呼び出されたかどうかをテストする必要があると感じます。Angular2 - 注入されたプライベートサービスメソッドが呼び出されたことをテストします

すべてのHTTP要求にコードを記述することなく、グローバルなエラー処理を行うことができるように、角度2のHTTPサービスの周りにラッパーサービスを構築しています。

クラスの小さなサンプルはそうのようなものです:

export class ApiService { 
    constructor(private http: Http, private error: Error, private apiConfig: ApiConfig) {} 

    public get(url: string, options: RequestOptionsArgs={}): Observable<any> { 
    return this.http.get(url, options).catch((error: any) => { 
    this.error.dispatch(error); 
    return error; 
    }); 
    } 
} 

私は、エラーならばキャッチ火災は私がテストすることはできませんように、エラー応答でgetメソッドとモック応答をテストしたい場合。これはプライベートなのでディスパッチメソッドが呼び出されました。私は秘密の方法でスパイすることはできません。

私は実際に「キャッチ」が解雇されていることをテストしていますし、明らかに内部のメソッドが実行されるのであれば、HTTPサービス自体をテストするだけです。 'catch'が呼び出されたときにerror.dispatchが呼び出しとして追加されていることを確認して、何らかの理由で別の開発者が削除した場合は失敗します。多分これはそれをテストする悪い方法ですか?私は他の提案をする。

私はそうのようなプライベートクラスをモックすることができます

{ provide: Error, useClass: FakeError } 

が、ApiServiceクラスの青写真は同じままで、今FakeErrorサービスがまだプライベートです。 Javaではインスタンスを独自に作成して注入することができます。これを所有しているため、インスタンスにアクセスできます。私はジャスミン/ typescript/angular2でそれを行う方法を見つけることを試みていると思いますか?

+0

あなたは秘密の方法でスパイすることができます。 – estus

+0

@estusこれは真実かもしれませんが、私がtypescriptを使用しているので、試してみることができません。そういうことをしようとすると、expect(service.error.dispatch).to ... then typescript linterが爆発します私はservice.errorにアクセスすることができません。なぜなら私的なものだからです。 – HomeBrew

答えて

5

これはspiesが役に立ちます。本当のErrorはDIなしでインスタンス化することができる場合は、

let error; 
beforeEach(()=>{ 
    error = new Error(); 
    spyOn(error, 'dispatch'); 

    TestBed.configureTestingModule({ 
    providers: [ 
     { provide: Error, useValue: error } 
    ] 
    }); 
}); 

it('',()=> { 
    expect(error.dispatch).toHaveBeenCalled(); 
}); 

を行うことができそれとも、Errorクラスを忘れて、モックを提供することができます。

class FakeError { 
    dispatch = jasmine.createSpy('dispatch'); 
} 

ちょうど上記のように使用してください。あなたは上記のようにspyOnを呼び出す必要はありません。ここでは、dispatchはすでにスパイです。

+0

素晴らしいです。 1つの質問、なぜ私はスパイをbeforeEachに入れなければならないのですか?それはitブロックではありません。私はそれを試みたが、うまくいかなかった、私は驚いた。何か案が? – HomeBrew

関連する問題