2016-06-26 13 views
12

मैं का उपयोग कर AngularFire 2 प्रमाणन एक नमूना कोणीय 2 एप्लिकेशन के लिए इकाई परीक्षण स्थापित करने के लिए कोशिश कर रहा हूँ, घटक काफी सरल है:इकाई परीक्षण में 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(); 
    } 
} 

सभी मैं कर रहा हूँ AngularFire में login और logout तरीकों के चारों ओर लपेटकर है इसलिए मैं अगर तरीकों कहा जाता था की जांच करने के एक नकली उपयोग करने के बारे में सोच रहा था, लेकिन मुझे यकीन है कि जहां शुरू करने के लिए, मैं अपने कल्पना फ़ाइल में निम्न कर की कोशिश की नहीं कर रहा हूँ:

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(); 
    }) 
); 
}); 

हालांकि मुझे यकीन है कि कैसे करने के लिए नहीं कर रहा हूँ login और logout विधियों का नकल करें क्योंकि वे इसका हिस्सा हैं auth संपत्ति, auth पर नकल करने का कोई तरीका है और login और logout विधियों को वापस करने का कोई तरीका है?

+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 रों AngularFireMock रों हो जाएगा।

संबंधित मुद्दे