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