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

时间:2014-09-18 22:15:37

标签: python unit-testing mocking stdout

所以我已经有这个问题已经有一段时间了,找不到解决方案。我有这个非常基本的运行代码。当我使用"TEST"来模拟输入时,我想测试预期的输出side_effects。第一次调用输入函数时,我模拟'y',然后在第二次调用它时模拟'1',然后应该触发print语句。问题是返回的输出是空的。我不知道发生了什么,但是当我手动运行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)

提前谢谢大家

2 个答案:

答案 0 :(得分:0)

Print("String", file=out)

您正在寻找的是什么,但您需要传递给主要的。

答案 1 :(得分:0)

您输入的补丁不能按要求运行,因为您没有给它一个功能。试试这个:

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)

而且,你的test_output签名中不需要变量'm'。