web-dev-qa-db-fra.com

Comment se moquer/remplacer la fonction getter d'un objet avec Jest?

Sinon, je peux faire ce qui suit:

var myObj = {
    prop: 'foo'
};

sinon.stub(myObj, 'prop').get(function getterFn() {
    return 'bar';
});

myObj.prop; // 'bar'

Mais comment puis-je faire la même chose avec Jest? Je ne peux pas simplement écraser la fonction avec quelque chose comme jest.fn(), car elle ne remplacera pas le getter. 

"ne peut pas définir la valeur de get"

8
I_like_foxes

Vous pouvez utiliser Object.defineProperty

Object.defineProperty(myObj, 'prop', {
  get: jest.fn(() => 'bar'),
  set: jest.fn()
});
11
Alex Robertson

Jest 22.1.0 introduit la possibilité de espionner les méthodes de lecture et de définition :

class MyClass {
  get something() {
    return true
  }
}

const spy = jest.spyOn(MyClass, 'something', 'get')
const something = new MyClass().something

expect(spy).toHaveBeenCalledTimes(1) // true
10
Franey

OMG Je suis venu ici tellement de fois. Enfin, trouvez la solution qui convient pour cela… Si vous vous souciez uniquement d’espionnage. Optez pour la réponse de @Franey. Cependant, si vous devez réellement modifier une valeur pour le getter, voici comment vous pouvez le faire.

class Awesomeness {
  get isAwesome() {
    return true
  }
}

describe('Awesomeness', () => {
  it('is not always awesome', () => {
    const awesomeness = new Awesomeness
    jest.spyOn(awesomeness, 'isAwesome', 'get').mockReturnValue(false)

    expect(awesomeness.isAwesome).toEqual(false)
  })
})
2
scieslak