#python #mocking #pytest #magicmock
#python #издевательство #pytest #magicmock
Вопрос:
Я обнаружил, что часто использую один и тот же шаблон в тестах снова и снова:
mock_get_data = mock.MagicMock()
mock_get_data.get_data.return_value = "mocked DB data"
mock_db = mock.Mock(spec=DBClass, return_value=mock_get_data)
Он будет использоваться для тестирования (с исправлением) этого типа кода:
db_connector = DBClass(settings)
print db_connector.get_data()
Есть ли какой-нибудь способ сделать эту «двойную макет» короче?
Ответ №1:
Вы можете сделать вот так:
mock_db = mock.Mock(spec=DBClass, return_value=mock.Mock(get_data=lambda:"mocked DB data"))
Комментарии:
1. Есть ли какой-либо способ сделать это без двойного макета. Создание макета?
2. Вы можете передать любой другой объект, например, сконфигурировать класс для него в fixtures и передать его как return_value, но я думаю, что макет — более правильный способ
Ответ №2:
Вы должны быть в состоянии сделать это, передав словарь конструктору, как описано в разделе документации «Настроить макет«, вместо того, чтобы настраивать его после создания MagicMock.
Я считаю, что желаемого результата можно достичь следующим образом:
mock_db = mock.Mock(spec=DBClass, return_value=mock.MagicMock(**{"get_data.return_value": "mocked DB data"})