【发布时间】:2018-10-27 01:12:24
【问题描述】:
以下方法的测试检查提示中的标准输出是否正确。
当 'input()' 被调用时,它会等待用户按下回车键并中断。通过自动按键“输入”,测试通过。
这很hacky,必须有更好的方法来测试这个方法。
方法:
class GameDisplay:
@staticmethod
def prompt(text):
input_value = input(text)
return input_value
测试:
from pynput.keyboard import Key, Controller
class TestGameDisplay(unittest.TestCase):
@patch('sys.stdout', new_callable=StringIO)
def test_prompt_output(self, mock_stdout):
keyboard = Controller()
keyboard.press(Key.enter)
self.gameDisplay.prompt('Choose 0: ')
keyboard.release(Key.enter)
self.assertEqual( mock_stdout.getvalue(), 'Choose 0: ')
if __name__ == '__main__':
unittest.main()
输出:
按回车键换行。
...................................
............................................
----------------------------------------------------------------------
Ran 79 tests in 0.113s
OK
测试修复尝试:
@patch('sys.stdout', new_callable=StringIO)
@patch('builtins.input', return_value='0')
def test_prompt_output(self, mock_stdout, input):
self.gameDisplay.prompt('Choose 0: ')
self.assertEqual( mock_stdout.getvalue(), 'Choose 0: ')
输出:
FAIL: test_prompt_output (tests.test_game_display.TestGameDisplay)
self.assertEqual( mock_stdout.getvalue(), 'Choose 0: ')
AssertionError: <MagicMock name='input.getvalue()' id='4675607744'> != 'Choose 0: '
----------------------------------------------------------------------
Ran 79 tests in 0.015s
FAILED (failures=1)
【问题讨论】:
-
尝试交换装饰器的顺序?
-
@AlexHall 交换装饰器时得到以下输出:
AssertionError: '' != 'Choose 0: ' -
也许只是单独打印提示,然后在没有提示的情况下使用
input()? -
这可以工作,但必须分别调用两个函数才能执行一项任务。
-
交换装饰器是朝着正确方向迈出的一步。然后,您还必须使用打印到标准输出的内容来修补
input。原始输入没有被调用,所以没有任何东西可以打印到标准输出,因此它的值是空字符串。
标签: python unit-testing mocking stdout pynput