我正在尝试为我的单元测试测试函数创建一个 Python Mixin,返回值和sys.stdout
. 我希望 Mixin 有一种方法可以作为装饰器来吞噬sys.stdout
,但到目前为止我还没有成功。
我的自定义装饰器应该:
sys.stdout
被测试函数产生的燕子- 使用
unittest.mock.patch
函数作为装饰器来实现 - 不接受任何输入(保持代码干净)
我对装饰器的尝试:
import io
import sys
import unittest.mock
class StdoutUnittestMixin(unittest.TestCase):
@unittest.mock.patch('sys.stdout', new_callable=io.StringIO)
def monkey_patch_stdout(self, original_function, mock_stdout):
def wrapper_function(*args, **kwargs):
captured_output = io.StringIO() # Create StringIO object
sys.stdout = captured_output # and redirect stdout.
return_value = original_function(*args, **kwargs) # Call unchanged function.
sys.stdout = sys.__stdout__ # Reset redirect.
return return_value
return wrapper_function
测试功能示例:
def foo(some_str):
print(some_str)
return some_str.isnumeric()
在单元测试中期望使用装饰器:
class Testing(unittest.TestCase):
@monkey_patch_stdout # The decorator wants inputs - I don't want that
def test_function_outputs_true(self):
self.assertTrue(foo("123"))
正如预期的那样,我得到:
TypeError: assert_True() missing 1 required positional argument: 'mock_stdout'
因为,我知道mock_stdout
需要在那里,因为unittest.mock.patch
装饰者需要。