在一个类中,我有一个属性(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'
答案 0 :(得分:0)
to_csv
是DataFrame
的一种方法,因此您必须修补该方法,因为它已在生产代码中导入:
@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)。
您似乎也想从固定装置中学习课程-在这种情况下,您必须将此固定装置添加到参数中:
@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()