如何在pytest中修补对象方法

2024-05-05 15:06:57 发布

您现在位置:Python中文网/ 问答频道 /正文

在一个类中,我有一个属性(self.data),它是pandas.DataFrame

我在类中有一个方法save(),它基本上调用self.data.to_csv(),并事先进行一些验证。在测试中,我想对其进行修补,这样它就不会在目录中实际存储数据,我只需要确保它作为模拟运行

我不知道如何修补它。到目前为止,我已经:

# Myclass.py

import pandas as pd
class Myclass:
    def __init__(self, data):
        self.data = pd.DataFrame(data=data)

    def save(self, path):
        # Do something validation
        # I would like to patch the line below. 
        self.data.to_csv(path)

test_myclass.py中:

from unittest import mock
import Myclass

@mock.patch(Myclass.to_csv)
def test_save(myclass_fixture):
    myclass_fixture.save(path)

我得到了一个错误:

AttributeError: type object 'Portfolio' has no attribute 'to_csv'

Tags: csvtopathpyimportselfdataframepandas
1条回答
网友
1楼 · 发布于 2024-05-05 15:06:57

to_csvDataFrame的一个方法,因此您必须修补该方法,因为它已导入到生产代码中:

@patch("myproject.Myclass.pd.DataFrame.to_csv")
def test_save(patched_to_csv):
    data = some_test_data  # this may come from a fixture
    my = MyClass(data)
    my.save("some_path")
    patched_to_csv.assert_called_once()

这假设您的项目布局为myproject/Myclass.py

请注意patch的第一个参数不是对象,而是一个字符串,包含修补对象的路径(请参见where to patch了解它应该包含的内容)

看起来您还想从一个fixture中获取类-在这种情况下,您必须将该fixture添加到参数中:

@pytest.fixture
def myclass_fixture():
   test_data = ...
   yield MyClass(test_data)

@patch("myproject.Myclass.pd.DataFrame.to_csv")
def test_save(patched_to_csv, myclass_fixture):
    myclass_fixture.save("some_path")
    patched_to_csv.assert_called_once()

相关问题 更多 >