Quelle est la meilleure façon de simuler correctement l'exemple suivant ?
Le problème est qu'après le temps d'importation, foo
conserve la référence à l'original non moqué bar
.
module.js
:
export function bar () {
return 'bar';
}
export function foo () {
return `I am foo. bar is ${bar()}`;
}
module.test.js
:
import * as module from '../src/module';
describe('module', () => {
let barSpy;
beforeEach(() => {
barSpy = jest.spyOn(
module,
'bar'
).mockImplementation(jest.fn());
});
afterEach(() => {
barSpy.mockRestore();
});
it('foo', () => {
console.log(jest.isMockFunction(module.bar)); // outputs true
module.bar.mockReturnValue('fake bar');
console.log(module.bar()); // outputs 'fake bar';
expect(module.foo()).toEqual('I am foo. bar is fake bar');
/**
* does not work! we get the following:
*
* Expected value to equal:
* "I am foo. bar is fake bar"
* Received:
* "I am foo. bar is bar"
*/
});
});
Je pourrais changer :
export function foo () {
return `I am foo. bar is ${bar()}`;
}
à :
export function foo () {
return `I am foo. bar is ${exports.bar()}`;
}
mais c'est assez laid à mon avis de le faire partout.
9 votes
Voir le fil de discussion sur
jest
Page GH github.com/facebook/jest/issues/936#issuecomment-5450800823 votes
En 2021, Jest dispose d'une méthode officielle pour réaliser ce "partial mocking", qui ne nécessite pas la modification de l'élément
module.js
et est simple et simple/déclaratif à écrire : jestjs.io/docs/mock-functions#mocking-partials .