如何模拟csv文件

kro*_*sjt 7 python csv mocking

我有一个csv解析器模块,它解析一个非常特定类型的.csv文件并从中提取字段.现在来测试这个模块我正在编写一些单元测试.传统上,为了测试模块,我将创建一个相同格式但具有有限条目的示例csv文件,然后将此文件传递给模块并检查输出.显然这不是很好,因为它依赖于测试文件本身.

什么是正确的方法?我已经阅读过关于mock模块以及它如何模拟的东西.但我不知道如何模拟特定文件.

Arn*_*rne 10

您没有提供任何测试数据,因此我希望我的随机示例可以很好地解决您的问题.简而言之:如果您不想在测试期间创建临时文件对象(这是一个合理的约束,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
Run Code Online (Sandbox Code Playgroud)

输出:

['col1', 'col2', 'col3']
['1', '3', 'foo']
['2', '5', 'bar']
['-1', '7', 'baz']
Run Code Online (Sandbox Code Playgroud)

编辑:替代字符串格式

我个人更喜欢使用三重字符串来表示文件,在您的情况下,普通字符串可能更好.请参阅此示例,了解如何方便地断行而不更改字符串的值.

in_mem_csv = StringIO(
    "col1,col2,col3\n"
    "1,3,foo\n"
    "2,5,bar\n"
    "-1,7,baz\n"
)
Run Code Online (Sandbox Code Playgroud)