如何使用鼻子测试 argparse 中打开的文件
How to test opened files in argparse using nose
所以我正在尝试使用 nose
测试我的解析器。我有几个用于使用 type=argparse.FileType()
.
处理文件的参数
当我打印出解析器的 parser_args()
函数时,当然指定了我的文件名参数,如下所示:
Namespace(command_name='edit', filename=[<open file 'filename.p', mode 'r' at 0x108d4e1e0>])
现在我想使用 nose
测试框架对此进行测试,特别是检查是否确实打开了正确的文件名,但我不知道具体是如何打开的。
当我这样做时(test_sys_args
已修改 sys.argv
列表以供测试):
test_parser = test_parser_output(test_sys_args)
assert_equal(test_parser.filename, "[<open file 'filename.p', mode 'r' at 0x108d4e1e0>]")
没用。我知道我做的不对,因为每次测试 运行 时内存地址都可能不同,而且我也不确定我是否可以像这样将 filename
对象作为字符串传递。
尝试:
assert_equal(test_parser.filename.name, 'filename.p')
assert_equal(test_parser.filename.mode, 'r')
这是 test_argparse.py
文件部分的一部分(来自最近的开发下载):
class RFile(object):
seen = {}
def __init__(self, name):
self.name = name
def __eq__(self, other):
if other in self.seen:
text = self.seen[other]
else:
text = self.seen[other] = other.read()
other.close()
if not isinstance(text, str):
text = text.decode('ascii')
return self.name == other.name == text
class TestFileTypeR(TempDirMixin, ParserTestCase):
"""Test the FileType option/argument type for reading files"""
def setUp(self):
super(TestFileTypeR, self).setUp()
for file_name in ['foo', 'bar']:
file = open(os.path.join(self.temp_dir, file_name), 'w')
file.write(file_name)
file.close()
self.create_readonly_file('readonly')
argument_signatures = [
Sig('-x', type=argparse.FileType()),
Sig('spam', type=argparse.FileType('r')),
]
failures = ['-x', '', 'non-existent-file.txt']
successes = [
('foo', NS(x=None, spam=RFile('foo'))),
('-x foo bar', NS(x=RFile('foo'), spam=RFile('bar'))),
('bar -x foo', NS(x=RFile('foo'), spam=RFile('bar'))),
('-x - -', NS(x=sys.stdin, spam=sys.stdin)),
('readonly', NS(x=None, spam=RFile('readonly'))),
]
有很多测试框架我没有展示,但你应该明白了。完整文件位于 https://hg.python.org/cpython/file/ba5d7041e2f5/Lib/test/test_argparse.py
所以我正在尝试使用 nose
测试我的解析器。我有几个用于使用 type=argparse.FileType()
.
当我打印出解析器的 parser_args()
函数时,当然指定了我的文件名参数,如下所示:
Namespace(command_name='edit', filename=[<open file 'filename.p', mode 'r' at 0x108d4e1e0>])
现在我想使用 nose
测试框架对此进行测试,特别是检查是否确实打开了正确的文件名,但我不知道具体是如何打开的。
当我这样做时(test_sys_args
已修改 sys.argv
列表以供测试):
test_parser = test_parser_output(test_sys_args)
assert_equal(test_parser.filename, "[<open file 'filename.p', mode 'r' at 0x108d4e1e0>]")
没用。我知道我做的不对,因为每次测试 运行 时内存地址都可能不同,而且我也不确定我是否可以像这样将 filename
对象作为字符串传递。
尝试:
assert_equal(test_parser.filename.name, 'filename.p')
assert_equal(test_parser.filename.mode, 'r')
这是 test_argparse.py
文件部分的一部分(来自最近的开发下载):
class RFile(object):
seen = {}
def __init__(self, name):
self.name = name
def __eq__(self, other):
if other in self.seen:
text = self.seen[other]
else:
text = self.seen[other] = other.read()
other.close()
if not isinstance(text, str):
text = text.decode('ascii')
return self.name == other.name == text
class TestFileTypeR(TempDirMixin, ParserTestCase):
"""Test the FileType option/argument type for reading files"""
def setUp(self):
super(TestFileTypeR, self).setUp()
for file_name in ['foo', 'bar']:
file = open(os.path.join(self.temp_dir, file_name), 'w')
file.write(file_name)
file.close()
self.create_readonly_file('readonly')
argument_signatures = [
Sig('-x', type=argparse.FileType()),
Sig('spam', type=argparse.FileType('r')),
]
failures = ['-x', '', 'non-existent-file.txt']
successes = [
('foo', NS(x=None, spam=RFile('foo'))),
('-x foo bar', NS(x=RFile('foo'), spam=RFile('bar'))),
('bar -x foo', NS(x=RFile('foo'), spam=RFile('bar'))),
('-x - -', NS(x=sys.stdin, spam=sys.stdin)),
('readonly', NS(x=None, spam=RFile('readonly'))),
]
有很多测试框架我没有展示,但你应该明白了。完整文件位于 https://hg.python.org/cpython/file/ba5d7041e2f5/Lib/test/test_argparse.py