2014-09-18 57 views
0

所以我一直有这个问题一段时间,找不到解决方案。我有这个运行代码,这是非常基本的。我想测试预期的输出,"TEST",当我用side_effects来模拟输入。第一次输入函数被称为我模拟'y',然后我第012次模拟'1'它被调用,然后应该触发print声明。问题是返回的输出是空的。我不知道发生了什么,但是当我手动运行main方法并输入输入时,我得到了预期的输出,所以我知道运行代码按预期工作,但在测试过程中发生了一些奇怪的事情。在Python模拟输入时输出为空单元测试

这里是我的运行代码

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) 

谢谢大家提前

+0

isint标准输出应该在你的情况下是空的?因为你输入'y'(在你补丁中),'难度='y'',这是否符合条件? – ashwinjv 2014-09-18 22:19:36

+0

我编辑我的代码(忘记更新),当我使用'side_effects'它补丁'y'满足第一个if语句时,''1''应该满足第二个条件。 @Ashwin – SalceCodec 2014-09-18 22:31:01

回答

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'。

+0

有了这个,我得到以下错误。运行代码保持不变。 'NameError:全局名'主'没有定义'应该定义 – SalceCodec 2014-09-18 23:01:31

+0

啊!我忘了添加从运行中导入main的行。编辑代码。现在试试。我正在测试我的测试脚本:) – ashwinjv 2014-09-18 23:02:25

+0

太棒了!我也错过了:)非常感谢。 – SalceCodec 2014-09-18 23:08:55

0
Print("String", file=out) 

是你在找什么,你需要,虽然传递出主。

+0

你能多解释一下吗?这是否进入单元测试或主? – SalceCodec 2014-09-18 22:50:10