I want to test that one of my ES6 modules calls another ES6 module in a particular way. With Jasmine this is super easy —
The application code:
// myModule.js
import dependency from './dependency';
export default (x) => {
dependency.doSomething(x * 2);
}
And the test code:
//myModule-test.js
import myModule from '../myModule';
import dependency from '../dependency';
describe('myModule', () => {
it('calls the dependency with double the input', () => {
spyOn(dependency, 'doSomething');
myModule(2);
expect(dependency.doSomething).toHaveBeenCalledWith(4);
});
});
What’s the equivalent with Jest? I feel like this is such a simple thing to want to do, but I’ve been tearing my hair out trying to figure it out.
The closest I’ve come is by replacing the import
s with require
s, and moving them inside the tests/functions. Neither of which are things I want to do.
// myModule.js
export default (x) => {
const dependency = require('./dependency'); // Yuck
dependency.doSomething(x * 2);
}
//myModule-test.js
describe('myModule', () => {
it('calls the dependency with double the input', () => {
jest.mock('../dependency');
myModule(2);
const dependency = require('../dependency'); // Also yuck
expect(dependency.doSomething).toBeCalledWith(4);
});
});
For bonus points, I’d love to make the whole thing work when the function inside dependency.js
is a default export. However, I know that spying on default exports doesn’t work in Jasmine (or at least I could never get it to work), so I’m not holding out hope that it’s possible in Jest either.