ionic/angular 存在 Firebase 单元测试 (jasmine) 问题的应用
ionic/angular app with firebase unit test (jasmine) issue
目前我正在使用 Ionic 和 Firebase 开发应用程序,但我遇到了单元测试问题。
以下错误信息:
无法读取未定义的 属性'subscribe'
实例化组件时出现错误。
见下文,部分代码:
组件构造函数:
constructor(
public angularFire: AngularFireAuth,
public router: Router,
private ngZone: NgZone,
private authService: FirebaseAuthService
) {
console.log("Constructor Initialized");
this.signInForm = new FormGroup({
email: new FormControl('', Validators.compose([
Validators.required,
Validators.pattern('^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$')
])),
password: new FormControl('', Validators.compose([
Validators.minLength(6),
Validators.required
]))
});
this.authRedirectResult = this.authService.getRedirectResult()
.subscribe(result => {
if (result.user) {
this.redirectLoggedUserToProfilePage();
} else if (result.error) {
this.submitError = result.error;
}
});
console.log("Constructor Done");
}
问题发生在我的身份验证服务上的 getRedirectFunction 方法上:
redirectResult: Subject<any> = new Subject<any>();
getRedirectResult(): Observable<any> {
return this.redirectResult.asObservable();
}
我的测试到现在:
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { IonicModule } from '@ionic/angular';
import { AngularFireAuth } from '@angular/fire/auth';
import { Router } from '@angular/router';
import { SignInPage } from './sign-in.page';
import { FirebaseAuthService } from '../firebase-auth.service';
describe('SignInPage', () => {
let component: SignInPage;
let fixture: ComponentFixture<SignInPage>;
let service: FirebaseAuthService;
const authStub: FirebaseAuthService = jasmine.createSpyObj('authStub', ['getAuthInstance', 'getRedirectResult']);
const fireStub: any = {
authState: {},
auth: {
signInWithEmailAndPassword() {
return Promise.resolve();
}
}
};
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ SignInPage ],
imports: [IonicModule.forRoot()],
providers:[
{ provide: FirebaseAuthService, useValue: authStub},
{ provide: AngularFireAuth, useValue: fireStub},
{ provide: Router, useClass: class { navigate = jasmine.createSpy('navigate') } }
],
}).compileComponents();
service = TestBed.get(FirebaseAuthService);
fixture = TestBed.createComponent(SignInPage);
component = fixture.debugElement.componentInstance;
fixture.detectChanges();
}));
it('should create the component', async(() => {
expect(component).toBeTruthy();
}));
});
关于方法 getRedirectFunction 返回未定义的原因的任何想法?请注意,我在嘲笑它..
我现在就这个问题道歉,但我是新手,所以欢迎任何建议。
提前致谢!
您的 authStub
间谍声明了一个 getRedirectResult
方法,但它没有模拟实现。因此,当代替您的实际函数调用时,它什么也不做(returns undefined)
您可以像这样提供 return 值:
authStub.getRedirectResult.and.returnValue(of());
目前我正在使用 Ionic 和 Firebase 开发应用程序,但我遇到了单元测试问题。 以下错误信息:
无法读取未定义的 属性'subscribe'
实例化组件时出现错误。
见下文,部分代码:
组件构造函数:
constructor(
public angularFire: AngularFireAuth,
public router: Router,
private ngZone: NgZone,
private authService: FirebaseAuthService
) {
console.log("Constructor Initialized");
this.signInForm = new FormGroup({
email: new FormControl('', Validators.compose([
Validators.required,
Validators.pattern('^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$')
])),
password: new FormControl('', Validators.compose([
Validators.minLength(6),
Validators.required
]))
});
this.authRedirectResult = this.authService.getRedirectResult()
.subscribe(result => {
if (result.user) {
this.redirectLoggedUserToProfilePage();
} else if (result.error) {
this.submitError = result.error;
}
});
console.log("Constructor Done");
}
问题发生在我的身份验证服务上的 getRedirectFunction 方法上:
redirectResult: Subject<any> = new Subject<any>();
getRedirectResult(): Observable<any> {
return this.redirectResult.asObservable();
}
我的测试到现在:
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { IonicModule } from '@ionic/angular';
import { AngularFireAuth } from '@angular/fire/auth';
import { Router } from '@angular/router';
import { SignInPage } from './sign-in.page';
import { FirebaseAuthService } from '../firebase-auth.service';
describe('SignInPage', () => {
let component: SignInPage;
let fixture: ComponentFixture<SignInPage>;
let service: FirebaseAuthService;
const authStub: FirebaseAuthService = jasmine.createSpyObj('authStub', ['getAuthInstance', 'getRedirectResult']);
const fireStub: any = {
authState: {},
auth: {
signInWithEmailAndPassword() {
return Promise.resolve();
}
}
};
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ SignInPage ],
imports: [IonicModule.forRoot()],
providers:[
{ provide: FirebaseAuthService, useValue: authStub},
{ provide: AngularFireAuth, useValue: fireStub},
{ provide: Router, useClass: class { navigate = jasmine.createSpy('navigate') } }
],
}).compileComponents();
service = TestBed.get(FirebaseAuthService);
fixture = TestBed.createComponent(SignInPage);
component = fixture.debugElement.componentInstance;
fixture.detectChanges();
}));
it('should create the component', async(() => {
expect(component).toBeTruthy();
}));
});
关于方法 getRedirectFunction 返回未定义的原因的任何想法?请注意,我在嘲笑它..
我现在就这个问题道歉,但我是新手,所以欢迎任何建议。
提前致谢!
您的 authStub
间谍声明了一个 getRedirectResult
方法,但它没有模拟实现。因此,当代替您的实际函数调用时,它什么也不做(returns undefined)
您可以像这样提供 return 值:
authStub.getRedirectResult.and.returnValue(of());