Я пытаюсь смоделировать объект 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 и не допустить его неопределенности для учетных данных?