gpt4 book ai didi

python - 如何在pytest中修补对象方法

转载 作者:行者123 更新时间:2023-12-04 15:27:18 26 4
gpt4 key购买 nike

在一个类(class)中,我有一个属性( 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'

最佳答案

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()

关于python - 如何在pytest中修补对象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61999253/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com