unittest 中的补丁标准输入没有写入其中的字符串
Patched stdin in unittest does not have the string written into it
如果我有 unittest.TestCase
,我会尝试在函数本身上修补 sys.stdin
:
@patch('sys.stdin', new_callable=StringIO)
def test_bla(mocked_stdin):
mocked_stdin.write("TEST")
a = MyClass()
a.do_stuff_with_stdin()
奇怪的是,如果我们尝试从 class 访问 sys.stdin
,我们刚刚写入的字符串将无法读取:
import sys
def do_stuff_with_stdin():
r = sys.stdin.read()
# r = ""
但是sys.stdin
已经被一个StringIO实例所取代。所以模拟成功了,只是内容是空的。
我 运行 这些测试使用 pytest
。
写下来后,我想出了一个解决方案,但我不确定为什么会这样。
我将补丁移到 class 中并直接使用应该在其中的数据实例化 StringIO
:
with patch('sys.stdin', StringIO(data)):
a = MyClass()
a.do_stuff_with_stdin()
这似乎可行,但我有点困惑为什么会这样。
更新: 我明白为什么这有效(也感谢 ),因为在这种情况下,StringIO 是用缓冲区初始化的,但是:“在两者中在某些情况下,初始文件位置从零开始。”
如果我有 unittest.TestCase
,我会尝试在函数本身上修补 sys.stdin
:
@patch('sys.stdin', new_callable=StringIO)
def test_bla(mocked_stdin):
mocked_stdin.write("TEST")
a = MyClass()
a.do_stuff_with_stdin()
奇怪的是,如果我们尝试从 class 访问 sys.stdin
,我们刚刚写入的字符串将无法读取:
import sys
def do_stuff_with_stdin():
r = sys.stdin.read()
# r = ""
但是sys.stdin
已经被一个StringIO实例所取代。所以模拟成功了,只是内容是空的。
我 运行 这些测试使用 pytest
。
写下来后,我想出了一个解决方案,但我不确定为什么会这样。
我将补丁移到 class 中并直接使用应该在其中的数据实例化 StringIO
:
with patch('sys.stdin', StringIO(data)):
a = MyClass()
a.do_stuff_with_stdin()
这似乎可行,但我有点困惑为什么会这样。
更新: 我明白为什么这有效(也感谢