从模拟方法访问实例对象

问题描述 投票:0回答:1

我正在尝试测试一个创建和转换数据帧的函数。在函数结束时,数据帧被保存为 csv。有没有办法“挂钩”函数并检索数据帧的最终状态?我尝试在函数的最后模拟

to_csv
方法,但我不知道如何从该调用中检索数据帧实例。

我知道我可以:

  • 读取生成的 csv 并以这种方式验证它,但我不想这样做,因为这些测试的运行程序具有不可预测的文件系统。
  • 返回数据帧,但是,这是一个很好的解决方案,因为我的实际函数是在气流中使用的,它不允许传递数据帧

这是一个精简的可运行示例:

foo.py

import pandas as pd

def bar():
    df = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6]})
    # assume df is transformed in some way
    df.to_csv('test.csv')

test.py

import unittest
from unittest.mock import patch, call
from foo import bar

class TestBar(unittest.TestCase):

    @patch("pandas.DataFrame.to_csv")
    def test_bar(self, mock_to_csv):        
        bar()

        # How do I access df?
        self.assertEqual(mock_to_csv.mock_calls, [call('test.csv')])
python unit-testing mocking
1个回答
0
投票

我感谢您提供的那个漂亮的最小可运行示例。

这里的批评肯定是函数 bar() 不太可测试,对吗?我的意思是,你不想让reactor bar 返回 df 吗?

或者更雄心勃勃地进行重构,使其接受 df,即使只是作为可选参数。这种 DI 将为您提供最大的灵活性。 那么目标代码逻辑将类似于“df = df or ...”

© www.soinside.com 2019 - 2024. All rights reserved.