2016-10-17 3 views
1

...Angular 2 Injectorは毎回新しいインスタンス化を行いますか?ユニットテスト私は、インジェクタを呼び出して、このようなHTTPオブジェクトをスパイしていて

beforeEach(async(inject([MyRepository, MockBackend, Http],(myRepository: MyRepository, backend: MockBackend, http : Http) => { 

    spyOn(http,'get').and.callThrough(); 

    backend.connections.subscribe((conn: MockConnection) => { 
     const options: ResponseOptions = new ResponseOptions({body: '[{"name":"chris"},{"name":"dave"}]'}); 
     conn.mockRespond(new Response(options)); 
    }); 
    TestBed.compileComponents(); 
    fixture = TestBed.createComponent(MyComponent); 
    fixture.detectChanges(); 

    }))); 

しかし、私はこのようなヘルパーメソッドにspyOn funcionをリファクタリングするとき...

class myTestHelper{ 
    public static spyOnHttp(): void{ 
    inject([Http],(http : Http) => { 
     spyOn(http, 'get').and.callThrough(); 
    }); 
    } 
} 

そして...私は次のエラーを取得する(代わりに直接spyOnの)私のテスト・セットアップから私の新しいコードを呼び出す

Error: <toHaveBeenCalledWith> : Expected a spy, but got Function.

新しい注入機能を使用すると、別のhttpオブジェクトが返されるようです。しかし、私は彼らが同じだろうと思った?インジェクタが使用されるたびに新しいものが作成された場合に、どの角度を使用するのかを角がどのように知っているのではないのですか?

答えて

0

Angular2 DIはプロバイダーごとに1つのインスタンスを保持します。

サービスをコンポーネントに提供する場合、このコンポーネントの各インスタンスは独自のサービスインスタンスを取得します。 子どもの1人がこのサービスのプロバイダも持っている場合を除いて、すべての子は同じサービスインスタンスを取得します。

@NgModule()でサービスを提供すると、それらはDIルートスコープで持ち上げられ、単一のインスタンスはアプリケーション全体と共有されます(コンポーネントに同じトークンのプロバイダがない限り)。

複数のモジュールが同じサービスを提供する場合でも、後で追加されるものと同じトークンの複数のプロバイダが以前に追加されたものを上書きするため、単一のインスタンスのみがDIによって維持されます。

遅延読み込みモジュールは、@NgModule()のプロバイダが吊り上げられている独自のスコープを取得します。

DIはコンポーネントからの検索を開始し、依存関係を要求し、この依存関係のプロバイダーのルートスコープに向かって検索し、見つかった最初のプロバイダーのサービスインスタンスを返します。

トークンは、サービスのタイプ(クラス)、文字列、またはOpaqueTokenです。ショートフォームproviders: [SomeService]

providers: [{provide: SomeService, useClass: SomeService}]と同じであり、タイプは以下のようにトークン(またはキー)が使用される(provide: SomeService)、また値(useClass: SomeService)として

+0

だから場合には確実に私は同じへのアクセスを有することになりますテストで1つのコンポーネントしか設定していないので、どこから呼び出すのかに関係なく 'http'引数を使用できますか? – Exitos

+0

同じコンポーネントインスタンスを再利用し、そのコンポーネントでのみ 'Http'を提供する場合は、同じインスタンスを取得する必要があります。 TestBed.createComponent(MyComponent)はテストごとに新しいコンポーネントインスタンスを作成するため、テストごとに新しいコンポーネントインスタンスが作成されます。異なる 'Http'インスタンス。 –

関連する問題