pytest: макет, возвращающий макет с определенными свойствами

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