I have this module with a function in it:
const utils = {
redirectTo(url) {
if (url) {
window.location = url;
}
},
};
export default utils;
It is used somewhere in a React component like this:
import utils from '../../lib/utils';
componentWillUpdate() {
this.redirectTo('foo')
}
Now I want to check that the value that redirectTo
is called with equals foo
.
it('should redirect if no rights', () => {
const mockRedirectFn = jest.fn();
utils.redirectTo = mockRedirectFn;
mount(
<SomeComponent />,
);
expect(mockRedirectFn).toBeCalled();
expect(mockRedirectFn).toBeCalledWith('foo');
console.log(mockRedirectFn.mock);
// { calls: [], instances: [] }
});
Thats what I've got and it does not work. How do I do this?
Mock the module Instead of mocking every function, jest helps us mimic the entire module using jest. mock. Create mocks directory into the same path of the file to mock, export the functions, and create the module's name in our case weatherAPI. In our test, the to jest uses the mock module with jest.
You have to mock the lib/utils
module like this:
import utils from '../../lib/utils';
jest.mock('../../lib/utils', () => ({
redirect: jest.fn()
}))
it('should redirect if no rights', () => {
mount(
<SomeComponent />,
);
expect(utils.redirect).toHaveBeenCalledWith();
});
This will replace the module with a mock that just returns {redirect:jest.fn()}
. This module is also imported into you test where you then can access the spy for redirect
and test on this that it was called with the correct parameter.
This is what I ended up using:
it('should redirect if no rights', () => {
// this way we mock only one method: redirectTo
jest.mock('lib/utils', () => {
const original = require.requireActual('lib/utils');
original.default.redirectTo = jest.fn();
return original;
});
const redirectTo = require.requireMock('lib/utils').default.redirectTo;
mount(
<SomeComponent />,
);
expect(redirectTo).toHaveBeenCalled();
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With