2017-01-23 24 views
1

私は、テストしたい角度2のサービスの機能を持っています。角度2のテストでモジュールを偽る

service.ts

upload(){ 
    let file = new Transfer(); 
    file.upload(myfile).then(// my callback); 
} 

私はjasmineを使用して私のテストでTransferをモックしたいと思います。私はそれを模擬するために、私の

sevice.spec.ts

import { TransferMock as Transfer } from '../mocks/mocks'でこれを試してみました。しかし、それは動作していません。これは私のテストがインスタンス化される方法です。

describe('authentication service' ,() => { 
    beforeEach(() => { 
    auth = new Service(<any>new HttpMock(), <any>new StorageMock()) 
    }); 
    it('initialize authentication',() => { 
    expect(auth).not.toEqual(null); 
    auth.upload('file'); //it fails here 
    }); 
}) 

編集

Transferは、サービス内に注入されていません。Transferを使用する関数は1つのみです。だから私は推測する(他の意見を知ってうれしい)アプリの初期読み込み時間を減らすことができます注入しないでください。だから私は、もしかして、このように構築されているならば、模擬することがあるのか​​どうかを知りたいのですが?

編集

それがベストプラクティスであると私はマーティンの答えを受け入れていたが、それはあなたがそれが失敗する可能性がブラウザのサポートを持っているdoesntのプラグインplugins.If ionic-nativeを使用する場合に発生することが一つの問題があります。この場合、私はそれを注入すると、エラーFileTransfer is not definedと起こった。だから、私は再び提案を探しています。

答えて

4

テストでクラスのモックを提供するには、実装にクラスを注入する必要があります。

ngModuleあなたのプロバイダに転送してください。それからあなたのサービスにそれを単に注入してください。

あなたのテストでは、TestBedプロバイダで{ provide: Transfer, useClass: TransferMock }を使用することができます。偽造 - - サービスのスタブを

アップデートは

依存性の注入の主な目的は、コードがテスト可能にするとからかっを可能にすることです。

更新

依存性の注入を使用すると、さまざまな環境のためのプロバイダの異なるセットを構成することができます。

たとえば、ブラウザとネイティブモバイル環境でアプリケーションを実行している場合、設定をスワップアウトすることができます。

const TRANSFER_PROVIDER: any; 

if (environment.browser) { 
    TRANSFER_PROVIDER = Transfer; 
} else { 
    TRANSFER_PROVIDER = { provide: Transfer, useClass: NativeTransfer } 
} 

... 
providers: [ TRANSFER_PROVIDER ] 

NativeTransferは何もしないシンプルなスタブことなく、エラーを防止する、またはそれは、ユーザーがこの機能がブラウザでサポートされていないことを知っている可能性ができます。あなたのモジュールで

あなたはこのような何かを持っている可能性があり。

+0

ありがとうございました。私の質問に言及したように、「転送」は私のサービスに注入されていません。 1つの関数だけが '' Transfer''を使用します。だから私は推測(?)初期ローディング時間を減らすことができます注入しないでください。だから私は、もしかして、このように構築されているならば、模擬することがあるのか​​どうかを知りたいのですが? – raj

+1

いいえ、マーティンの言葉通りに行うべきです。 1つの方法でのみ使用されていても、あなたのサービスに転送する欠点はありません。これは共通のパターンです。 – philipooo

+0

@raj Dependancy Injectionを使用すると、パフォーマンスヒットは表示されません。代わりに、テスト可能なコードの利点があります。 – Martin

関連する問題