You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python unittest测试CSV生成失败,mock替换后原函数未执行

问题根源

你用@mock.patch('my_code_to_be_tested.my_code_to_be_tested.create_file')装饰测试函数时,unittest.mock会直接把create_file替换成一个Mock对象——也就是说,你调用mc.create_file(data, file_name)时,执行的是模拟版本的函数,完全不会触发原函数里生成CSV的逻辑,自然找不到文件。

解决方案

根据你的测试需求,分两种场景处理:

场景1:测试create_file的实际文件生成功能

如果要验证原函数真的能生成正确的CSV文件,直接移除mock装饰器,调用真实函数后检查文件,同时记得测试后清理生成的文件:

import os
from my_code_to_be_tested import my_code_to_be_tested as mc

...

def test_create_file(self):
    data = self._get_data()  # 类方法内调用无需传self
    file_name = self._get_filename()  
    mc.create_file(data, file_name)
    
    test_dir = os.path.dirname(os.path.abspath(__file__))
    # 注意原函数会自动给文件名加.csv后缀,路径要对应
    file_path = os.path.join(test_dir, f'{file_name}.csv')
    
    try:
        assert os.path.isfile(file_path)
        # 可选:还可以读取文件内容,验证数据是否正确写入
        # df = pd.read_csv(file_path)
        # assert df.equals(data)
    finally:
        # 测试结束后删除文件,避免污染测试环境
        if os.path.exists(file_path):
            os.remove(file_path)

场景2:仅测试create_file的调用逻辑

如果不需要实际生成文件,只是想验证create_file是否被正确调用(比如参数是否符合预期),就保留mock,但要断言mock的调用情况而非检查文件:

from unittest import mock
from my_code_to_be_tested import my_code_to_be_tested as mc

...

@mock.patch('my_code_to_be_tested.my_code_to_be_tested.create_file')
def test_create_file_call(self, mock_create_file):
    data = self._get_data()
    file_name = self._get_filename()
    mc.create_file(data, file_name)
    
    # 断言函数被调用了一次
    mock_create_file.assert_called_once()
    # 断言调用时传入的参数完全正确
    mock_create_file.assert_called_with(data, file_name)

另外注意:你代码里的self._get_data(self)写法错误,类成员方法内部调用自身方法时,不需要额外传self,直接写self._get_data()即可。

内容的提问来源于stack exchange,提问作者phoenix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 04:12:27