Mock External Library Functions in Jest
Suppose you import two functions from an external library in one of your js files:
import { func1, func2 } from "externalLib";
export const doSomething = () => {
func1();
func2();
// ...
};
Now let's write a test for this function, and say we want to mock func1
.
describe("doSomething", () => {
jest.mock("externalLib", () => ({
func1: jest.fn(),
}));
it("does something", () => {
func1.mockImplementation(...);
// ...
});
});
But oh no! This test will fail - we inadvertently blew away the rest of the implementation of externalLib
when we created the mock for func1
. Since doSomething
relies on other functions in externalLib
, we get errors.
In order to preserve the rest of the implementation of externalLib
and only mock func1
, we need to call requireActual and spread it's return into the mock to get the implementation of the rest of the library:
describe("doSomething", () => {
jest.mock("externalLib", () => ({
...jest.requireActual("externalLib"),
func1: jest.fn(),
}));
it("does something", () => {
func1.mockImplementation(...);
// ...
});
});
Et voilà, your test will pass ✅.
Tweet