在 Python 中使用 MagicMock 时遇到问题
Facing issues while using MagicMock in Python
我是 Python 的新人。我正在尝试使用 MagicMock 编写一个 UT,如下所示:
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 进行相同的测试。然后它开始失败。
虽然我使用 @patch(DBFactory.get_db_for_env)
创建了 mock,但是 DBFactory class 的 get_db_for_env() 函数实际上在 运行 使用 python 进行单元测试时被调用3.6.我不知道如何解决这个问题。
我已经能够通过以下方式解决它:
@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()
我是 Python 的新人。我正在尝试使用 MagicMock 编写一个 UT,如下所示:
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 进行相同的测试。然后它开始失败。
虽然我使用 @patch(DBFactory.get_db_for_env)
创建了 mock,但是 DBFactory class 的 get_db_for_env() 函数实际上在 运行 使用 python 进行单元测试时被调用3.6.我不知道如何解决这个问题。
我已经能够通过以下方式解决它:
@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()