我不太明白为什么每个人都想检查 foo 调用 bar。
Foo 有一些功能,这个功能需要测试。如果 foo 使用 bar 来执行此操作,我不应该担心。
期望的结果是在foo(msg)
调用之后,将其msg.upper()
发送到标准输出。
您可以将 stdout 重定向到字符串缓冲区并检查此字符串缓冲区的内容是否符合您的预期。
例子:
import sys
import unittest
from io import TextIOWrapper, BytesIO
class TestScript(unittest.TestCase):
def setUp(self):
self._old_stdout = sys.stdout
sys.stdout = TextIOWrapper(BytesIO(), sys.stdout.encoding)
def _output(self):
self._stdout.seek(0)
return self._stdout.read()
def test_foo(self):
hello_test = HelloTest()
hello_test.foo("blub")
self.assertEqual(self._output(), "BLUB")
def tearDown(self):
sys.stdout = self._old_stdout
self._stdout.close()
您也可以对标准输入执行此操作(并写入标准输入以模拟某些输入),如果您需要做任何特殊的事情,您可以继承 TestIOWrapper,例如允许在sys.stdout
不使用的情况下发送非 unicode 文本sys.stdout.buffer
(Python 2 与 Python 3 )。在这个 SO answer中有一个例子。当您(仍然)仅使用 Python 2 时,使用StringIO
可能比使用 io 模块更好。