Как издеваться над провайдерами аутентификации Firebase, такими как FacebookAuthProvider? - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь смоделировать объект react-native-firebase firebase.auth, чтобы он возвращал учетные данные для тестируемого кода, чтобы я мог проверить свой метод.

У меня тестируется следующий код:

public async FacebookSignIn(): Promise<void> {
    try {
      const result = await LoginManager.logInWithReadPermissions(['public_profile', 'email']);

      if (result.isCancelled) {
        throw new Error('User cancelled request');

      }

      const data = await AccessToken.getCurrentAccessToken();

      if (!data) {
        throw new Error('Something went wrong obtaining the users access token');
      }

      const credential = firebase.auth.FacebookAuthProvider.credential(data.accessToken);
      await firebase.auth().signInWithCredential(credential);
    }
    catch (error) {
      console.error(error);
    }
  }

Я хочу убедиться, что в конце функции мой CUT вызывает signInWithCredential, поэтому у меня есть такой тестовый пример;func является глобальным: jest.fn()

describe('FacebookSignIn', () => {
    it('should sign in user with facebook credentials', async () => {
      await service.FacebookSignIn();
      expect(func).toHaveBeenCalled();
    })
  })

Однако, с помощью следующей насмешки я получаю ошибку TypeError: Cannot read property 'credential' of undefined:

jest.mock('react-native-firebase', () => {
  return {
    auth: () => {
      return {
        currentUser: null,
        signOut: func,
        signInAnonymously: func,
        signInWithEmailAndPassword: func,
        signInWithCredential: func,
        FacebookAuthProvider: jest.fn(() => {
          return {
            credential: jest.fn(() => {
              return {
                provider: 'dummy',
                token: '1234',
                secret: '5678'
              }
            })
          }
        })
      }
    }
  }
});

Я посмотрел на тип для firebase.auth и он может вернуть это:

type AuthModule = {
    (): RNFirebase.auth.Auth;
    nativeModuleExists: boolean;
} & RNFirebase.auth.AuthStatics

, который, на мой взгляд, корректно издевается над методами signIn, но методы AuthStatics не проверяются.AuthStatics определяется следующим образом:

interface AuthStatics {
        EmailAuthProvider: EmailAuthProvider;
        PhoneAuthProvider: AuthProvider;
        GoogleAuthProvider: AuthProvider;
        GithubAuthProvider: AuthProvider;
        OAuthProvider: AuthProvider;
        TwitterAuthProvider: AuthProvider;
        FacebookAuthProvider: AuthProvider;
        PhoneAuthState: {
          CODE_SENT: string;
          AUTO_VERIFY_TIMEOUT: string;
          AUTO_VERIFIED: string;
          ERROR: string;
        };
      }

Как я могу издеваться над свойством FacebookAuthProvider и не допустить его неопределенности для учетных данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...