如果我有一个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
运行这些测试。
答案 0 :(得分:0)
写下来之后,我想出了一个解决方案,但是我不确定为什么会起作用。
我将补丁移到类中,并使用应该存在的数据直接实例化StringIO
:
with patch('sys.stdin', StringIO(data)):
a = MyClass()
a.do_stuff_with_stdin()
这似乎可行,但是我有点困惑为什么会这样。
更新:我知道为什么可以这样做(也要感谢@hoefling's comment),因为在这种情况下,StringIO是用缓冲区初始化的,但是:“在两种情况下,初始文件位置从零开始。”