我试着尽可能清楚地说出标题。我是单元测试的新手,我掌握了一些更基本的断言类型,但有一个测试我还没弄明白。所以我让用户输入某种类型的输入,我通过调用某种类型的消息之前的变量来打印输出。这是testsuite正在测试的py文件
def get_input()
pirateInput = input("What be ye name?! ")
print("Ahoy Captain ", pirateInput)
用户输入一个名称,然后我将其打印出来。所以预期的输出应该是“Ahoy Captain [用户输入]”
这是我的测试套件
import unittest
from unittest.mock import patch
from get_input import *
class GetInputTest(unittest.TestCase):
def test_ValuePrints(self):
#patch input as 'Hook'
@patch('builtins.input', return_value='Hook'
saved_stdout = sys.stdout
try:
out = io.StringIO()
sys.stdout = out
get_input()
output = out.getvalue().strip()
assert output == 'Ahoy Captain Hook'
finally:
sys.stdout = saved_stdout
if __name__ == "__main__":
unittest.main()
所以我检查了我期望的输出,但测试确实按预期修补了输入。我不知道我是否清楚,但希望有人可以提供帮助。如果您需要更多细节,请告诉我。
由于
答案 0 :(得分:1)
问题很简单。 print
函数已经在每对参数之间添加了一个空格,所以如果你这样做了
print("Ahoy Captain ", pirateInput)
将打印:Ahoy Captain Hook
。注意两个空格,即您在第一个字符串末尾添加的空格和print
添加的空格。只需删除字符串中的那个即可。
这是一个完整的工作示例:
import unittest
import sys
import io
import logging
from unittest.mock import patch
def get_input():
pirateInput = input("What be ye name?! ")
print("Ahoy Captain", pirateInput)
class GetInputTest(unittest.TestCase):
@patch('builtins.input', return_value='Hook')
def test_ValuePrints(self, sth):
log = logging.getLogger( "SomeTest.testSomething" )
saved_stdout = sys.stdout
try:
out = io.StringIO()
sys.stdout = out
get_input()
output = out.getvalue().strip()
log.debug(output)
assert output == 'Ahoy Captain Hook'
finally:
sys.stdout = saved_stdout
if __name__ == "__main__":
logging.basicConfig( stream=sys.stderr )
logging.getLogger( "SomeTest.testSomething" ).setLevel( logging.DEBUG )
unittest.main()
试运行:
$ python3 main.py
DEBUG:SomeTest.testSomething:Ahoy Captain Hook
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK