I have a series of functions, each performing various firestore interactions. How do I use Jest to mock these firestore calls? I would like to avoid using a library.
When I use jest.mock("firebase/app")
and jest.mock("firebase/firestore")
and other variations, I either get null TypeErrors, or errors indicating I am still referencing the actual import and not the mock: Error: ... make sure you call initializeApp()
.
For example, a simple function I want to test:
import firebase from "firebase/app";
import "firebase/firestore";
export const setDocData = (id, data) => {
const newDoc = {
created: firebase.firestore.FieldValue.serverTimestamp(),
...data
};
firebase
.firestore()
.doc("docs/" + id)
.set(newDoc);
};
Notice how firebase is imported as usual, then firestore is imported a side effect. Also notice how firestore is called first as a function, then later referenced as a property. I believe this is the source of my trouble.
I used the dependancy injection approach on components and it meant I could mock and test methods without all the boilerplate.
For example, I have a form component that handles invites like so:
The
checkIfTeamExists
method relies on firebase auth andhandleTeamCreation
method writes to the firestore.When I referenced the component in its parent I instantiated it like so:
Then, using
react-testing-library
, in my tests I was able to mock things out with a simplejest.fn()
.and mocked the firestore where query in the same way.
This is very simple, but it works. It's also quite verbose but I thought a real use case would be more helpful than a contrived example. I hope this helps someone.