How to mock AngularFire 2 service in unit test?

前端 未结 3 1877
情话喂你
情话喂你 2021-02-05 12:14

I\'m trying to set up unit tests for a sample Angular 2 app using AngularFire 2 auth, the component is fairly simple:

import { Component } from \'@angular/core\'         


        
3条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2021-02-05 12:39

    Similar to @jan, I made a mock using some utility functions:

    import {AngularFireAuth} from '@angular/fire/auth';
    import {AngularFireDatabase} from '@angular/fire/database';
    import {auth} from 'firebase/app';
    
    import { Observable, of, Subscription } from 'rxjs';
    
    /**
     * Mocks the Firebase auth by automatically logging in.
     */
    export const AngularFireAuthMock = jasmine.createSpy('signInWithEmailAndPassword')
          .and.returnValue(Promise.resolve({uid: 'fakeuser'}));
    
    /**
     * Mocks an AngularFireDatabase that always returns the given data for any path.
     */
    export function mockAngularFireDatabase(data): AngularFireDatabase {
      return {
        object: (path: string): any => {
          return {
            valueChanges() {
              return of(data);
            }
          }
        }
      } as AngularFireDatabase;
    }
    

    and then you can use them in your spec like this:

     beforeEach(async () => {
        await TestBed.configureTestingModule({
          declarations: [ TweakComponent ],
          imports: [ MatDialogModule, RouterTestingModule ],
          providers: [
           { provide: MAT_DIALOG_DATA, useValue: {} },
           { provide: AngularFireDatabase, useValue: mockAngularFireDatabase({testdata:'hi'})},
           { provide: AngularFireAuth, useValue: AngularFireAuthMock}
         ],
        })
        .compileComponents();
      });
    

提交回复
热议问题