Как насмехаться/заменить функцию геттера объекта с помощью Jest?

139
7

В Sinon я могу сделать следующее:


var myObj = {
prop: 'foo'
};

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

myObj.prop; // 'bar'


Но как я могу сделать то же самое с Jest?
Я не могу просто перезаписать функцию чем-то вроде jest.fn(), потому что она не заменит getter


"не может установить значение get"


спросил(а) 2021-01-25T17:41:19+03:00 4 месяца, 3 недели назад
1
Решение
171

Вы можете использовать Object.defineProperty

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

ответил(а) 2021-01-25T17:41:19+03:00 4 месяца, 3 недели назад
160

Для всех, кто сталкивался с этим ответом, в Jest 22.1.0 появилась возможность шпионить за методами получения и установки.

Edit: как в ответе scieslak ниже, потому что вы можете шпионить за методами getter и setter, вы можете использовать Jest mocks с ними, как и с любой другой функцией:

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

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

expect(something).toEqual('bar')

ответил(а) 2021-01-25T17:41:19+03:00 4 месяца, 3 недели назад
77

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

ответил(а) 2021-01-25T17:41:19+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема