【问题标题】:Mocking method pandas.read_excel does not work with @patch Python模拟方法 pandas.read_excel 不适用于@patch Python
【发布时间】:2020-08-19 17:08:25
【问题描述】:

我正在为一个项目使用 Python 编写单元测试,最近遇到了装饰器 @patch 的问题。我有以下方法需要测试

def _read_from_disk(self, excel_kwargs):
        """
        Read excel file from disk and apply excel_kwargs.

        Args:
            excel_kwargs: Parameters for pandas.read_excel.

        Returns:
            DataFrame or dict of DataFrames.
        """
        return pd.read_excel(self.location, **excel_kwargs)

我的测试方法结构是

 @patch("program.data.excel.BaseExcelReader._read_from_disk.pd.read_excel")
    def test___read_from_disk(self, mock_df):
        mock_df.return_value = pd.DataFrame({"test_id": [1, 2, 3, 4, 5]})
        return_df = self.test_reader._read_from_disk(self.excel_kwargs_svd)
        pd.testing.assert_frame_equal(return_df, pd.DataFrame({"test_id": [1, 2, 3, 4, 5]}))

这给了我以下错误:

ModuleNotFoundError: 没有名为“program.data.excel.BaseExcelReader”的模块; 'program.data.excel' 不是一个包

请注意,测试方法只是一个示例。该问题的目的是找到一种使用@patch 模拟pandas.read_excel 的方法。谢谢

【问题讨论】:

  • 所以你的文件名是program/data/excel.py 还是别的什么?照原样,补丁肯定是错误的,因为它试图修补函数中定义的pd - 我猜它是在模块中导入的。请显示测试代码的文件名/结构和相关的导入。
  • pandas 的导入为“import pandas as pd”,文件结构为补丁装饰器“program.data.excel.BaseExcelReader._read_from_disk”中的那个。我找不到如何使用@patch 模拟熊猫的示例。
  • 文件名为program/data/excel.py
  • 它与 @patch("program.data.excel.pd.read_excel") 一起使用。谢谢你。你让我想到了文件中的路径。
  • 啊,我就是这么想的——很高兴能帮上忙!

标签: python unit-testing mocking python-unittest patch


【解决方案1】:

您可以直接修补“pandas.read_excel”而不是“program.data.excel.BaseExcelReader._read_from_disk.pd.read_excel”

代码:

@patch("pandas.read_excel")
def test___read_from_disk(self, mock_df):
    mock_df.return_value = pd.DataFrame({"test_id": [1, 2, 3, 4, 5]})
    return_df = self.test_reader._read_from_disk(self.excel_kwargs_svd)
    pd.testing.assert_frame_equal(return_df, pd.DataFrame({"test_id": [1, 2, 3, 4, 5]}))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    相关资源
    最近更新 更多