My simple understanding of these two functions in react/frontend projects is the following:
jest.fn()
- You want to mock a function and really don’t care about the original implementation of that function (it will be overridden by
jest.fn()) - Often you just mock the return value
- This is very helpful if you want to remove dependencies to the backend (e.g. when calling backend API) or third party libraries in your tests
- It is also extremly helpful if you want to make real unit tests. You don’t care about if certain function that gets called by the unit you test is working properly, because thats not part of it’s responsibility.
jest.spyOn()
- The original implementation of the function is relevant for your test, but:
- You want to add your own implementation just for a specific scenario and then reset it again via
mockRestore()(if you just use ajest.spyOn()without mocking it further it will still call the original function by default) - You just want to see if the function was called
- …
- You want to add your own implementation just for a specific scenario and then reset it again via
- I think this is especially helpful for integration tests, but not only for them!
(Good blog post: https://medium.com/@rickhanlonii/understanding-jest-mocks-f0046c68e53c)