2016-06-21 19 views
2

私は、ユーザーのメッセージを取得できるサービスを表す "Messages"注射可能なものを持っています。このクラスは、ユーザーの資格情報を使用してバックエンドにログインする「データベース」クラスに依存します。角2依存注入:複数のインスタンスを注入する

は、今は、ユーザ1から送信されたメッセージは、従ってユーザ2

の受信トレイに直接到達するかどうかを自動的にテストするために、2人のユーザーが同時にログインしている間にテストケースを作成したいです2つの異なる「メッセージ」インスタンスに、「データベース」という2つの異なるインスタンスを注入する方法が必要です。

私は次のことを試してみました:

beforeEachProviders(() => [ 
    Messages, Database 
    ]); 

    beforeEach(inject([Messages], (msg) => { 
    this.msg1 = msg; 
    })); 

    beforeEach(inject([Messages], (msg) => { 
    this.msg2 = msg; 
    })); 

しかし、MSG1とMSG2は、「メッセージ」の同じインスタンスを表していることが判明:

it('testcase',() => { 
    // this.msg1 == this.msg2; 
}); 

は、それが作成するために、インジェクタを伝えることは可能です"メッセージ"とその依存関係の異なるインスタンス?

答えて

1

これはAngular DIの動作方法です。単一のプロバイダの場合は、常に同じインスタンスを取得します。あなたがInjectorを注入し、

var child = ReflectiveInjector.fromResolvedProviders(
    ResolvedReflectiveProvider([Message, Database]), injector); 
var msg2 = child.get(Message); 

他のプロバイダが親インジェクタから再利用されている間、あなたはMessageDatabaseの別のインスタンスを取得する必要があります。この方法を使用することができます回避策として

(のようなMockBackend、...) `

また

var injector = ReflectiveInjector.resolveAndCreate([Message, Database]); 
var msg2 = child.get(Message); 

を使用することができます。しかし、この方法は、あなたはすべてのdependeを提供する必要があります親がないので、MessageDatabaseだけでなく、

+0

ありがとう、私はこのエラーが表示されます:http://pastebin.com/raw/56N7sfZ9私はこのコードを使用しました:http://pastebin.com/raw/5kh2ZHvD – highwaychile

+0

申し訳ありません、あまりにも早く入力してください:私はこのエラーを受け取ります:pastebin.com/raw/56N7sfZ9私はこのコードを使用しました:pastebin.com/raw/5kh2ZHvD – highwaychile

+0

私はそれがどのように子インジェクタを作成するのが間違っています。私は自分の答えを更新しました。 –

関連する問題