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
相关产品推荐
相关产品推荐

