python-3.x - 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' != ''
我在哪里搞砸了?
解决方案
您必须stdout
在打印之前重定向。您不能在之后重定向并期望获得未重定向的print
s:
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)
推荐阅读
- android - 如果你想用它来保护整个应用程序(例如银行应用程序),你如何正确配置 local_auth?
- javascript - 检查 HTML 元素是否在视口中
- amp-html - amp-script:innerHTML 按原样呈现与符号转义的序列
- aspnetboilerplate - 获取 ABP .NET 核心框架中的所有父表行和所有子表行
- javascript - Javscript Math.Pow 乘法
- linux - 我们可以在 azure 管道 yaml 文件中编写用户定义函数吗?
- ubuntu - 我无法重新启动 ssh (git bash)
- azure - Azure APIM VNet 卡住
- python - 如何用pandas做滚动窗口计算,这样每1分钟计算一个新值
- c# - Azure blob customerProvidedKey 与 EncryptionPolicy