Python: проблема с получением вывода во время модульного теста — библиотека Unittest

Я пытаюсь получить вывод для тестирования, я использую библиотеки unittest и unittest.mock. Я рассмотрел многие другие связанные вопросы (например, этот: Как подтвердить вывод с помощью Nosetest/Unittest в python? среди прочего), и все они предлагают что-то вроде того, что есть в моем коде, но я получаю только пустую строку и не могу найти, где я ошибаться.

Моя функция делает что-то вроде этого:

def my_func():
  a = int(input("put a 2 digit number"))
  b = [1,2,3,4,5,6,7,8,9,0]
  if a in b:
    print("wrong number")

И это связанный тест:

import io
import sys
import unittest
from unittest.mock import patch
from io import StringIO
from somemodule import my_func

def test_entering_wrong_value(self):

        user_input = ['2']

        with patch('builtins.input', side_effect=user_input):
            self.my_func()
            capturedOutput = io.StringIO()
            sys.stdout = capturedOutput
            output = capturedOutput.getvalue().strip()
            self.assertEqual('wrong number', output)

Как я понял, это должно захватить выводимую строку и сравнить с тестовым значением, но не может захватить строку, я просто получаю пустую строку и эту ошибку:

AssertionError: 'wrong number' != ''

Где я ошибаюсь?


person Cristianjs19    schedule 28.05.2019    source источник


Ответы (1)


Вы должны перенаправить stdout ПРЕЖДЕ, чем делать отпечатки. Вы не можете перенаправить после и ожидать получить print, которые не были перенаправлены:

import io
import sys
import unittest
from unittest.mock import patch
from somemodule import my_func

def test_entering_wrong_value(self):

        user_input = ['2']

        with patch('builtins.input', side_effect=user_input):
            capturedOutput = io.StringIO()
            sys.stdout = capturedOutput
            self.my_func()
            output = capturedOutput.getvalue().strip()
            sys.stdout = sys.__stdout__ # Restore stdout so prints work normally
            self.assertEqual('wrong number', output)
person Error - Syntactical Remorse    schedule 28.05.2019