在unittest中修补的stdin中没有写入字符串

时间:2019-07-08 11:12:49

标签: python testing pytest python-unittest sys

如果我有一个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()

奇怪的是,如果我们尝试从该类访问sys.stdin,那么刚才写的字符串就不会被读取:

import sys

def do_stuff_with_stdin():
    r = sys.stdin.read()
    # r = ""

但是sys.stdin已替换为StringIO实例。这样的模拟就起作用了,只是内容为空。

我正在使用pytest运行这些测试。

1 个答案:

答案 0 :(得分:0)

写下来之后,我想出了一个解决方案,但是我不确定为什么会起作用。

我将补丁移到类中,并使用应该存在的数据直接实例化StringIO

with patch('sys.stdin', StringIO(data)):
    a = MyClass()
    a.do_stuff_with_stdin()

这似乎可行,但是我有点困惑为什么会这样。

更新:我知道为什么可以这样做(也要感谢@hoefling's comment),因为在这种情况下,StringIO是用缓冲区初始化的,但是:“在两种情况下,初始文件位置从零开始。”