我有一个 csv 解析器模块,它解析非常特定类型的 .csv 文件并从中提取字段。现在为了测试这个模块,我正在编写一些单元测试。传统上,为了测试模块,我会创建一个格式相同但条目有限的示例 csv 文件,然后将此文件传递给模块并检查输出。显然这不是很好,因为对测试文件本身有依赖性。
解决这个问题的正确方法是什么?我已经阅读了有关 mock 模块以及它如何模拟事物的信息。但我不知道如何模拟特定文件。
最佳答案
您没有提供任何测试数据,所以我希望我的随机示例能够很好地解决您的问题。简而言之:如果您不想在测试期间创建临时文件对象(这是一个合理的约束,imo),请使用 StringIO
。 mock
模块有一个很大的进入障碍,所以除非你想要它更高级的 mock
功能,否则没有必要使用它。
from io import StringIO
from csv import reader # this should import your custom parser instead
in_mem_csv = StringIO("""\
col1,col2,col3
1,3,foo
2,5,bar
-1,7,baz""") # in python 2.7, put a 'u' before the test string
test_reader = reader(in_mem_csv, delimiter=',', quotechar='|')
for line in test_reader:
print(line)
# whatever you need to test to make sure the csv reader works correctly
输出:
['col1', 'col2', 'col3']
['1', '3', 'foo']
['2', '5', 'bar']
['-1', '7', 'baz']
替代字符串格式
我个人更喜欢用三重字符串来表示文件,普通字符串可能更适合您的情况。请参阅此示例,了解如何方便地换行而不更改字符串的值。
in_mem_csv = StringIO(
"col1,col2,col3\n"
"1,3,foo\n"
"2,5,bar\n"
"-1,7,baz\n"
)
关于python - 如何模拟一个csv文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47830223/