为什么我的断言在读取 NamedTemporaryFile 时失败?
Why is my assertion failing when reading a NamedTemporaryFile?
我正在编写读取文件并根据该文件的内容创建字典的代码。代码非常简单,但我想测试边缘情况。
这是我的尝试:
from tempfile import NamedTemporaryFile
from nose.tools import *
def read_file(filename):
with open(filename) as f:
my_dict = { dict(line.strip().split(',')) for line in f }
return my_dict
def test_read_file():
file_contents = b"""Hello,World"""
with NamedTemporaryFile() as fp:
fp.write(file_contents)
my_dict = read_file(fp.name)
print(my_dict)
assert my_dict == { "Hello" : "World" }
不幸的是,这个断言失败了,因为 my_dict
是一个空字典。
我的理解是,一个NamedTemporaryFile
一旦关闭,就销毁了,所以我不指望在[=13=之后直接销毁] 的 my_dict
已填充。 fp
被打开两次:一次写入,一次读取 -- 这就是麻烦制造者吗?
这是测试读取文件的函数的正确方法吗?如果是这样,为什么我的断言失败了?如果不是,编写此测试的更好机制是什么?
您需要刷新写入以确保在读取之前写入数据。
def test_read_file():
file_contents = b"""Hello,World"""
with NamedTemporaryFile() as fp:
fp.write(file_contents)
fp.flush()
my_dict = read_file(fp.name)
print(my_dict)
assert my_dict == { "Hello" : "World" }
您可以使用内存中类似文件的对象,而不是使用真实文件。这需要模拟 open
,或更改您的 API 以采用类似文件的对象而不是文件名。
import unittest.mock
import io
def test_read_file():
file_contents = io.BytesIO(b"""Hello,World""")
m = unittest.mock.mock_open(read_data=file_contents)
with unittest.mock.patch('__main__.open', m):
my_dict = read_file("fake.txt")
print(my_dict)
assert my_dict == { "Hello" : "World" }
我正在编写读取文件并根据该文件的内容创建字典的代码。代码非常简单,但我想测试边缘情况。
这是我的尝试:
from tempfile import NamedTemporaryFile
from nose.tools import *
def read_file(filename):
with open(filename) as f:
my_dict = { dict(line.strip().split(',')) for line in f }
return my_dict
def test_read_file():
file_contents = b"""Hello,World"""
with NamedTemporaryFile() as fp:
fp.write(file_contents)
my_dict = read_file(fp.name)
print(my_dict)
assert my_dict == { "Hello" : "World" }
不幸的是,这个断言失败了,因为 my_dict
是一个空字典。
我的理解是,一个NamedTemporaryFile
一旦关闭,就销毁了,所以我不指望在[=13=之后直接销毁] 的 my_dict
已填充。 fp
被打开两次:一次写入,一次读取 -- 这就是麻烦制造者吗?
这是测试读取文件的函数的正确方法吗?如果是这样,为什么我的断言失败了?如果不是,编写此测试的更好机制是什么?
您需要刷新写入以确保在读取之前写入数据。
def test_read_file():
file_contents = b"""Hello,World"""
with NamedTemporaryFile() as fp:
fp.write(file_contents)
fp.flush()
my_dict = read_file(fp.name)
print(my_dict)
assert my_dict == { "Hello" : "World" }
您可以使用内存中类似文件的对象,而不是使用真实文件。这需要模拟 open
,或更改您的 API 以采用类似文件的对象而不是文件名。
import unittest.mock
import io
def test_read_file():
file_contents = io.BytesIO(b"""Hello,World""")
m = unittest.mock.mock_open(read_data=file_contents)
with unittest.mock.patch('__main__.open', m):
my_dict = read_file("fake.txt")
print(my_dict)
assert my_dict == { "Hello" : "World" }