In meiner Angular2 App, die AngularFire2 verwendet, habe ich eine AuthService
die versucht, anonym mit Firebase zu authentifizieren.Test für abgelehnte Versprechen mit Jasmine
Ich versuche, einen Test zu schreiben, der AngularFireAuth
's signInAnonymously
erwartet, um eine abgelehnte Zusage zurückzugeben; für authState
zu null
und ein Fehler geworfen werden.
Ich bin ein neuer Jasmine und Test im Allgemeinen, aber ich denke, ich muss möglicherweise asynchrone Tests verwenden, aber ich bin ziemlich stecken.
Hier ist eine vereinfachte AuthService
:
import { Injectable } from '@angular/core';
import { AngularFireAuth } from 'angularfire2/auth';
import * as firebase from 'firebase/app';
import { Observable } from 'rxjs/Rx';
@Injectable()
export class AuthService {
private authState: firebase.User;
constructor(private afAuth: AngularFireAuth) { this.init(); }
private init(): void {
this.afAuth.authState.subscribe((authState: firebase.User) => {
if (authState === null) {
this.afAuth.auth.signInAnonymously()
.then((authState) => {
this.authState = authState;
})
.catch((error) => {
throw new Error(error.message);
});
} else {
this.authState = authState;
}
}, (error) => {
throw new Error(error.message);
});
}
}
Und hier meine Testspezifikt sind:
import { TestBed, inject } from '@angular/core/testing';
import { AngularFireAuth } from 'angularfire2/auth';
import 'rxjs/add/observable/of';
import { Observable } from 'rxjs/Rx';
import { AuthService } from './auth.service';
import { environment } from '../environments/environment';
describe('AuthService',() => {
const mockAngularFireAuth: any = {
auth: jasmine.createSpyObj('auth', {
'signInAnonymously': Promise.resolve('foo'),
// 'signInWithPopup': Promise.reject(),
// 'signOut': Promise.reject()
}),
authState: Observable.of(null)
};
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
{ provide: AngularFireAuth, useValue: mockAngularFireAuth },
{ provide: AuthService, useClass: AuthService }
]
});
});
it('should be created', inject([ AuthService ], (service: AuthService) => {
expect(service).toBeTruthy();
}));
//
//
//
//
//
describe('when we can’t authenticate',() => {
beforeEach(() => {
mockAngularFireAuth.auth.signInAnonymously.and.returnValue(Promise.reject('bar'));
});
it('should thow', inject([ AuthService ], (service: AuthService) => {
expect(mockAngularFireAuth.auth.signInAnonymously).toThrow();
}));
});
//
//
//
//
//
});
Vielen Dank für Ihre Hilfe!
Warum schreiben Sie den Test für der Schein? Was soll der zu testende Code tun? – jonrsharpe
Hallo @jonrsharpe, ich verspotte 'AngularFireAuth's' signInAnonymous ', sonst würde es jedes Mal, wenn die Tests ausgeführt werden, tatsächlich Firebase aufrufen. Ich werde dazu gebracht zu glauben, dass ich diese Art von Drittanbieter verspotten soll? –
Ja, aber dieser Schein ist das einzige, was dein Test zu trainieren scheint. – jonrsharpe