2016-06-26 18 views
12

私はAngularFire 2認証を使用して、サンプル角度2アプリ用のユニットテストをセットアップしようとしているが、部品は非常に簡単です:私がやっているすべてはAngularFireでloginlogout方法の周りにラップしているユニットテストでAngularFire 2サービスを模擬する方法は?

import { Component } from '@angular/core'; 
import { AngularFire, AuthProviders } from 'angularfire2'; 

@Component({ 
    moduleId: module.id, 
    selector: 'app-root', 
    templateUrl: 'app.component.html', 
    styleUrls: ['app.component.css'] 
}) 
export class AppComponent { 
    isLoggedIn: boolean; 

    constructor(public af: AngularFire) { 
    this.af.auth.subscribe(auth => { 
     if (auth) { 
     this.isLoggedIn = true; 
     } else { 
     this.isLoggedIn = false; 
     } 
    }); 
    } 

    loginWithFacebook() { 
    this.af.auth.login({ 
     provider: AuthProviders.Facebook 
    }); 
    } 

    logout() { 
    this.af.auth.logout(); 
    } 
} 

私はメソッドが呼び出されたかどうかをチェックするためにモックを使用して考えていたが、どこから始めれば私はわからないんだけど、私は私のspecファイルに次のようにやってみました:

import { provide } from '@angular/core'; 
import { AngularFire } from 'angularfire2'; 
import { 
    beforeEach, beforeEachProviders, 
    describe, xdescribe, 
    expect, it, xit, 
    async, inject 
} from '@angular/core/testing'; 
import { AppComponent } from './app.component'; 

spyOn(AngularFire, 'auth'); 

beforeEachProviders(() => [ 
    AppComponent, 
    AngularFire 
]); 

describe('App Component',() => { 
    it('should create the app', 
    inject([AppComponent], (app: AppComponent) => { 
     expect(app).toBeTruthy(); 
    }) 
); 

    it('should log user in', 
    inject([AppComponent], (app: AppComponent) => { 
     expect(app.fb.auth.login).toHaveBeenCalled(); 
    }) 
); 

    it('should log user out', 
    inject([AppComponent], (app: AppComponent) => { 
     expect(app.fb.auth.logout).toHaveBeenCalled(); 
    }) 
); 
}); 

私はどのようにわからないがloginlogoutの方法は、 authのプロパティは、authと戻ってloginlogoutメソッドを模擬する方法はありますか?このスニペットで

+3

興味深い読者は、これを苦痛の少ないものにすることに関して[この問題](https://github.com/angular/angularfire2/issues/18)を追跡する必要があります。 – drewmoore

答えて

13

beforeEach(() => addProviders([ 
    AppComponent, 
    AngularFire 
]); 

あなたが設定(またはoverride)テストで使用されるプロバイダ。

これは言い換えれば、別のクラスを作成することもできますし、模様を{ provide: originalClass, useClass: fakeClass }という表記を使用してAngularFire実際のクラスの代わりに提供することもできます。このような

何か:あなたのテストで

class AngularFireAuthMock extends AngularFireAuth {   // added this class 
    public login() { ... } 
    public logout() { ... } 
} 

class AngularFireMock extends AngularFire {     // added this class 
    public auth: AngularFireAuthMock; 
} 

beforeEach(() => addProviders([ 
    AppComponent, 
    { provide: AngularFire, useClass: AngularFireMock }   // changed this line 
]); 

そしてAngularFire sがAngularFireMock秒になります。

関連する問題