2014-09-18 56 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