Возникли проблемы при использовании MagicMock в Python - PullRequest
0 голосов
/ 25 февраля 2020

Я новичок в Python. Я пытаюсь написать UT с помощью MagicMock следующим образом:

    db_obj = MagicMock(DBFactory.get_db_for_env)
    db_obj.fetch_cursor_records.return_value = self.get_success_csv()

    db_obj.fetch_cursor_records.assert_called_once_with()
    upload_to_s3.assert_called_once_with(json.dumps(self.get_success_csv()))

    @staticmethod
    def get_success_csv():
       return [{"test_col1": "test_val1", "test_col2" : "test_val2"}]

Здесь я сталкиваюсь с ошибкой следующим образом:

AttributeError: Mock object has no attribute 'fetch_cursor_records'

Даже когда я издеваюсь над fetch_cursor_records следующим образом:

self.extractor.db_obj.fetch_cursor_records = 
MagicMock(DBFactory.get_db_for_env.fetch_cursor_records)

Я все еще сталкиваюсь с проблемой следующим образом:

AttributeError: 'function' object has no attribute 'fetch_cursor_records'

РЕДАКТИРОВАТЬ :

Я мог решить вышеуказанную проблему с ответом, который я отправил , Но, похоже, работает с Python 3.7. Но согласно требованию, я должен был проверить то же самое с python 3.6. Тогда это начало терпеть неудачу.

Хотя я создал mock с помощью @patch(DBFactory.get_db_for_env), но функция get_db_for_env () класса DBFactory фактически вызывается при выполнении модульного теста с python 3.6. Я понятия не имею, как это исправить.

1 Ответ

0 голосов
/ 25 февраля 2020

Я смог решить это следующим образом:

@patch('DBFactory.get_db_for_env')
def test_extract_success(self, mock_db_obj):
    mock_db_obj.fetch_cursor_records.return_value = self.get_success_csv()
    self.db_obj = mock_db_obj
    self.call_function()
    self.db_obj.fetch_cursor_records.assert_called_once_with()
...