首页 > 解决方案 > Python:在单元测试期间尝试捕获输出时出现问题 - Unittest 库

问题描述

我正在尝试捕获要测试的输出,我正在使用 unittest 和 unittest.mock 库。我已经查看了许多其他相关问题(例如:如何在 python 中使用nosetest/unittest 断言输出?等等)以及他们提出的所有建议,例如我的代码中包含的内容,但我只得到一个空字符串,并且找不到我弄错的地方。

我的函数做这样的事情:

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' != ''

我在哪里搞砸了?

标签: python-3.xunit-testingiopython-unittest

解决方案


您必须stdout在打印之前重定向。您不能在之后重定向并期望获得未重定向的prints:

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)

推荐阅读