Я пытаюсь протестировать метод, который запоминается через lru_cache
(так как это дорогой вызов базы данных). с pytest-mock
.
Упрощенная версия кода:
class User:
def __init__(self, file):
# load a file
@lru_cache
def get(self, user_id):
# do expensive call
Тогда я тестирую:
class TestUser:
def test_get_is_called(self, mocker):
data = mocker.ANY
user = User(data)
repository.get(user_id)
open_mock = mocker.patch('builtins.open', mocker.mock_open())
open_mock.assert_called_with('/foo')
Но я получаю следующую ошибку:
TypeError: unhashable type: '_ANY'
Это происходит потому, что для functools.lru_cache
необходимо, чтобы хранимые ключи были хешируемыми , т. Е. Реализован метод __hash__
или __cmp__
.
Как я могу издеваться над такими методами в макере, чтобы он работал?
Я пробовал
user.__hash__.return_value = 'foo'
без удачи.