web-dev-qa-db-fra.com

Se moquer des méthodes statiques en plaisantant

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?

16
Clemens

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');
  });
});
22
Peter Stonham

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;
1
mandarin