在Python单元测试中模拟输入时,输出为空

在Python单元测试中模拟输入时,输出为空,python,unit-testing,mocking,stdout,Python,Unit Testing,Mocking,Stdout,所以我已经有一段时间遇到这个问题了,但找不到解决方案。我有一个非常基本的运行代码。当我使用副作用模拟输入时,我想测试预期的输出,“test”。第一次调用输入函数时,我模拟'y',第二次调用时,我模拟'1',这将触发打印语句。问题是返回的输出是空的。我不知道发生了什么,但是当我手动运行main方法并输入输入时,我得到了预期的输出,因此我知道运行代码按预期工作,但是在测试期间发生了一些奇怪的事情 这是我的运行代码 def main(): newGame = input("") i

所以我已经有一段时间遇到这个问题了,但找不到解决方案。我有一个非常基本的运行代码。当我使用
副作用
模拟输入时,我想测试预期的输出,
“test”
。第一次调用输入函数时,我模拟
'y'
,第二次调用时,我模拟
'1'
,这将触发
打印
语句。问题是返回的输出是空的。我不知道发生了什么,但是当我手动运行main方法并输入输入时,我得到了预期的输出,因此我知道运行代码按预期工作,但是在测试期间发生了一些奇怪的事情

这是我的运行代码

def main():

    newGame = input("")

    if newGame == 'y':
        print("1.Scallywag\n2.Crew\n3.Pirate")

        difficulty = input("")

        if difficulty == '1':
            print("TEST")


main()
这是我的测试代码

import unittest
from unittest.mock import patch
import io
import sys

from Run import main

class MyTestCase(unittest.TestCase):

    @patch('builtins.input', side_effects=['y','1'])
    def test_output(self,m):
      saved_stdout = sys.stdout
      try:
          out = io.StringIO()
          sys.stdout = out
          main()
          output = out.getvalue().strip()
          self.assertIn("TEST", output)
      finally:
          sys.stdout = saved_stdout


if __name__ == "__main__":
  unittest.main()
这是我在回溯过程中得到的
AssertionError
,请注意,它的预期是
,但事实并非如此

F
======================================================================
FAIL: test_output (__main__.MyTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python33\lib\unittest\mock.py", line 1087, in patched
    return func(*args, **keywargs)
  File "C:\Users\jsalce\Desktop\Testcases\Test.py", line 20, in test_output
    self.assertIn("TEST", output)
AssertionError: 'TEST' not found in ''

----------------------------------------------------------------------
Ran 1 test in 0.006s

FAILED (failures=1)
提前谢谢大家

Print("String", file=out)

是您正在寻找的,但您需要传递到main。

您的输入补丁无法按要求工作,因为您没有为其提供功能。试试这个:

import unittest
from unittest.mock import patch, MagicMock
import io
import sys

from Run import main

class MyTestCase(unittest.TestCase):

    #@patch('builtins.input', side_effects=['y','1'])
    @patch('builtins.input', MagicMock(side_effect=['y','1']))
    def test_output(self):
      saved_stdout = sys.stdout
      try:
          out = io.StringIO()
          sys.stdout = out
          main()
          output = out.getvalue().strip()
          self.assertIn("TEST", output)
          #I used equals to see if I am truly grabbing the stdout
          #self.assertEquals("TEST", output)
      finally:
          sys.stdout = saved_stdout

if __name__ == "__main__":
  unittest.main(verbosity=2)

而且,在测试输出签名中不需要变量“m”。

在您的情况下,stdout是否应该为空?由于您输入了“y”(在您的补丁中),
难度='y'
哪个不符合if条件?我在使用
副作用时编辑了我的代码(忘记更新)
它修补了满足第一个if语句的“y”,因此
'1'
应该满足第二个条件@AshwinCan你能再解释一下吗?这是进入单元测试还是主测试?我得到以下错误。运行代码保持不变<代码>名称错误:未定义全局名称“main”应将其定义为AH!我忘了添加从运行导入主数据的行。编辑代码。现在试试。我正在用我的测试脚本进行测试:)