0

我是 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 进行相同的测试。然后它开始失败。

虽然我创建了 mock @patch(DBFactory.get_db_for_env),但 DBFactory 类的 get_db_for_env() 函数实际上在使用 python 3.6 运行单元测试时被调用。我对如何解决这个问题一无所知。

4

1 回答 1

0

我已经能够通过以下方式解决它:

@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()
于 2020-02-25T09:10:36.667 回答