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 是用缓冲区初始化的,但是:“在两者中在某些情况下,初始文件位置从零开始。”