I’m doing tests for LoginScreen in my react native app using Jest , but I’m facing problem to test block of code inside onAuthStateChange method .
LoginScreen.tsx
<code>
const setToken= async(token:any)=> {
await SecureStore.setItemAsync('token', token)
//setSkip(false)
}
useEffect(() => {
const unsubscribe = auth().onAuthStateChanged( (user: FirebaseAuthTypes.User | null) => {
console.log("USER IS STILL LOGGED IN: " , user);
if (user) { current user
user.getIdToken(true)
.then(latestToken => {
console.log(latestToken)
console.log(user)
setToken(latestToken) //call setToken function
setUserID(user.uid) //state change
})
.catch(err => console.log(err))
}else {
if user signed out from profile screen
deleteToken()
}
return unsubscribe();
});
}, [isUerSignedIn]);
</code>
<code>
const setToken= async(token:any)=> {
await SecureStore.setItemAsync('token', token)
//setSkip(false)
}
useEffect(() => {
const unsubscribe = auth().onAuthStateChanged( (user: FirebaseAuthTypes.User | null) => {
console.log("USER IS STILL LOGGED IN: " , user);
if (user) { current user
user.getIdToken(true)
.then(latestToken => {
console.log(latestToken)
console.log(user)
setToken(latestToken) //call setToken function
setUserID(user.uid) //state change
})
.catch(err => console.log(err))
}else {
if user signed out from profile screen
deleteToken()
}
return unsubscribe();
});
}, [isUerSignedIn]);
</code>
const setToken= async(token:any)=> {
await SecureStore.setItemAsync('token', token)
//setSkip(false)
}
useEffect(() => {
const unsubscribe = auth().onAuthStateChanged( (user: FirebaseAuthTypes.User | null) => {
console.log("USER IS STILL LOGGED IN: " , user);
if (user) { current user
user.getIdToken(true)
.then(latestToken => {
console.log(latestToken)
console.log(user)
setToken(latestToken) //call setToken function
setUserID(user.uid) //state change
})
.catch(err => console.log(err))
}else {
if user signed out from profile screen
deleteToken()
}
return unsubscribe();
});
}, [isUerSignedIn]);
mockFile //mocks/@react-native-firebase/auth/index
<code> export const mockedUserCredentials={
sendEmailVerification: jest.fn().mockResolvedValue(true)
, emailVerified: true
}
export const user = { email: '[email protected]',
uid: '12345678abcdefg'
}
const auth = jest.fn().mockReturnValue({
onUserChanged: jest.fn().mockResolvedValue(()=>(res:any) => mockedUserCredentials) ,
onAuthStateChanged: jest.fn().mockResolvedValue(()=>(res:any) => user),
signInWithEmailAndPassword: jest.fn().mockResolvedValue(mockedUserCredentials),
currentUser:mockedUserCredentials,
});
export default auth;
</code>
<code> export const mockedUserCredentials={
sendEmailVerification: jest.fn().mockResolvedValue(true)
, emailVerified: true
}
export const user = { email: '[email protected]',
uid: '12345678abcdefg'
}
const auth = jest.fn().mockReturnValue({
onUserChanged: jest.fn().mockResolvedValue(()=>(res:any) => mockedUserCredentials) ,
onAuthStateChanged: jest.fn().mockResolvedValue(()=>(res:any) => user),
signInWithEmailAndPassword: jest.fn().mockResolvedValue(mockedUserCredentials),
currentUser:mockedUserCredentials,
});
export default auth;
</code>
export const mockedUserCredentials={
sendEmailVerification: jest.fn().mockResolvedValue(true)
, emailVerified: true
}
export const user = { email: '[email protected]',
uid: '12345678abcdefg'
}
const auth = jest.fn().mockReturnValue({
onUserChanged: jest.fn().mockResolvedValue(()=>(res:any) => mockedUserCredentials) ,
onAuthStateChanged: jest.fn().mockResolvedValue(()=>(res:any) => user),
signInWithEmailAndPassword: jest.fn().mockResolvedValue(mockedUserCredentials),
currentUser:mockedUserCredentials,
});
export default auth;
LogniScreen.test.tsx
<code>expect(await authMock.onAuthStateChanged).toBeCalled(); //passed
expect(await SecureStore.setItemAsync).toBeCalled(); //failed
...
</code>
<code>expect(await authMock.onAuthStateChanged).toBeCalled(); //passed
expect(await SecureStore.setItemAsync).toBeCalled(); //failed
...
</code>
expect(await authMock.onAuthStateChanged).toBeCalled(); //passed
expect(await SecureStore.setItemAsync).toBeCalled(); //failed
...
I’ve tried a lot to figure it out but I couldn’t mock onAuthStateChanged properly ,
so how should I mock onAuthStateChanged to be able to test the code inside ?.