J'ai du mal à simuler une méthode statique par plaisanterie. Imaginez que vous avez une classe A avec une méthode statique:
export default class A {
f() {
return 'a.f()'
}
static staticF () {
return 'A.staticF()'
}
}
Et une classe B qui importe A
import A from './a'
export default class B {
g() {
const a = new A()
return a.f()
}
gCallsStaticF() {
return A.staticF()
}
}
Maintenant, vous voulez simuler A. Il est facile de simuler f ():
import A from '../src/a'
import B from '../src/b'
jest.mock('../src/a', () => {
return jest.fn().mockImplementation(() => {
return { f: () => { return 'mockedA.f()'} }
})
})
describe('Wallet', () => {
it('should work', () => {
const b = new B()
const result = b.g()
console.log(result) // prints 'mockedA.f()'
})
})
Cependant, je n'ai pu financer aucune documentation sur la façon de simuler A.staticF. Est-ce possible?
Une option consiste à utiliser bind.
import A from '../src/a';
import B from '../src/b';
jest.mock('../src/a');
describe('Wallet', () => {
it('should work', () => {
const mockStaticF = jest.fn();
mockStaticF.mockReturnValue('worked');
A.staticF = mockStaticF.bind(A);
const b = new B();
const result = b.gCallsStaticF();
expect(result).toEqual('worked');
});
});
J'ai réussi à me moquer de lui dans un fichier séparé dans le __mocks__
dossier utilisant le prototypage. Vous feriez donc:
function A() {}
A.prototype.f = function() {
return 'a.f()';
};
A.staticF = function() {
return 'A.staticF()';
};
export default A;