web-dev-qa-db-ja.com

Jestでオブジェクトのゲッター機能をモック/置換する方法は?

シノンでは、次のことができます。

_var myObj = {
    prop: 'foo'
};

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

myObj.prop; // 'bar'
_

しかし、Jestでも同じことができますか? jest.fn()のような関数で関数を上書きすることはできません。ゲッターを置き換えないためです

「getの値を設定できません」

14
I_like_foxes

Object.defineProperty

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

この答えに出くわした誰かのために、Jest 22.1.0は getterおよびsetterメソッドのスパイ の機能を導入しました。

編集: scieslak's answer 以下のように、ゲッターメソッドとセッターメソッドをスパイできるため、他の関数と同じようにJestモックを使用できます:

class MyClass {
  get something() {
    return 'foo'
  }
}

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

expect(something).toEqual('bar')
27
Franey

OMG私はここに何度も来ました。最後に、これに対する適切な解決策を見つけてください。スパイだけを気にするなら。 @Franeyの答えを探してください。ただし、実際にゲッターの値をスタブする必要がある場合は、これを行うことができます

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)
  })
})
5
scieslak