簡體   English   中英

在Python單元測試中模擬輸入時輸出為空

[英]Output is empty when mocking input in Python Unit Test

所以我已經有一段時間這個問題了,找不到解決方案。我有這個非常基本的運行代碼。 當我使用side_effects模擬輸入時,我想測試預期的輸出"TEST" 第一次調用輸入函數時,我模擬了'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)

謝謝大家

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)

而且,您在test_output簽名中不需要變量'm'。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM