2017-02-22 15 views
0

存在しない、私は私のテストクラスでAngular2ジャスミンSpyOn方法

export let AUTH_SERVICE = new OpaqueToken('auth.service'); 

export interface AuthService { 
    logIn(): void; 
    logOut(): void; 
} 

を次のように私はAuthServiceのスタブバージョンを提供インターフェースと不透明なトークンを定義し、すなわち、

@Injectable() 
class AuthServiceStub implements AuthService { 
    logIn(): void {} 
    logOut(): void {} 
} 

と設定しています私のテストをbeforeEachにすると、次のようになります。

beforeEach(async(() => { 
     TestBed.configureTestingModule({ 
      declarations: [ LoginComponent ], 
      providers: [ 
       {provide: AUTH_SERVICE, useValue: AuthServiceStub} 
      ] 
     }); 
    })); 

テストを書き、すなわち、

it('should call log in on AuthService',() => { 
     let authService = fixture.debugElement.injector.get(AUTH_SERVICE); 
     spyOn(authService, 'logIn'); 
     // expect will go here 
}); 

が、私は次のエラー

Error: <spyOn> : logIn() method does not exist 

を取得するためには、私が間違ってやっているものを見ることができません。何か案は?

+0

これはランタイムエラーの場合、あなたのideまたはブラウザの 'authService'インスタンスを調べて、' logIn'メソッドが存在するかどうかを調べることができます。 – Igor

+0

私はこれらのテストを適切にデバッグすることはできません。しかし、 'AuthServiceStub'にコンストラクタを追加してそのコンストラクタのコンソールに書き込むと(' console.log( 'CREATED') 'など)、コンソールに' CREATED'を出力することはありません。作成されている.... –

答えて

6

プロバイダオブジェクトにuseValueプロパティを使用しているためです。つまり、注入された値はAuthServiceStubクラスそのものになります。あなたが代わりにしたいものは、実際にそれらのメソッドを持つインスタンスです。

テストを行うには、useValueuseClassに置き換えてください。これにより、プロバイダが作成され、fixture.debugElement.injector.get(AUTH_SERVICE);コールが適切なオブジェクトを返すときに、Angularの依存性注入システムが実際にサービスをインスタンス化するようになります。

また、手動でクラスをインスタンス化できます。それはAuthServiceが必要になる場合があります将来のすべての注射を処理するため、

it('should call log in on AuthService',() => { 
    let AuthService = fixture.debugElement.injector.get(AUTH_SERVICE); 
    let authService = new AuthService(); 
    spyOn(authService, 'logIn'); 
    // expect will go here 
}); 

はそれでも、useClassは、よりよい解決策です。

+0

ハハ!作品....私は完全にテスト文書を読むときに私を渡した。素晴らしい、私は上に移動することができます:) –

関連する問題