【发布时间】:2017-04-19 04:32:41
【问题描述】:
我正在尝试对采用文件路径并返回一些文件内容的解析函数进行单元测试。我希望能够将这些函数的数据字符串传递给测试目的。
我知道我可以将 csv.reader() 传递给 StringIO 或 file_handle(例如 csv.reader(StringIO("my,data") 或 csv.reader(open(file)))),但我不能看到一种方法,我可以通过 StringIO 对象代替 filepath 因为 open(StringIO("my, data")) 失败。同样我希望在这些解析中具有文件打开/关闭逻辑方法而不是在我的主要代码中,因为这会使我的主要代码混乱,也意味着我必须重新编写所有文件 IO 接口!
看来我的选择是:
- 重写所有现有代码,以便将文件句柄传递给解析函数 - 这真的很痛苦!
- 使用 mock.patch() 替换 open() 方法 - 这应该可以工作,但似乎比这项任务需要的更复杂!
- 做一些我还没有想到但我确信它一定存在的事情!
import unittest
class TestImport(unittest.TestCase):
def test_read_string(self):
string_input = u"a,b\nc,d\n"
output = read_file(string_input)
self.assertEqual([['a', 'b'], ['c', 'd']], output)
def test_read_file(self):
filename = "sample_data.csv"
output = read_file(filename)
self.assertEqual([['a', 'b'],['c', 'd']], output)
【问题讨论】:
-
为什么不直接将测试用例写入硬盘并传递路径?
-
这就是代码当前的工作方式 - 我试图避免这种情况,因为:A 我不想跟踪大量非常小的文本文件B 解析有很多配置选项 - 我很容易在代码中操纵字符串来模拟这些,但是使用文件需要几十个,这使得我的构建看起来“凌乱”
标签: python unit-testing csv stream stringio