[英]Can't listen to print function in __main__.py with unittest.mock
我正在尝试收听来自__main__.py
的print
function 。 我使用来自unittest.mock
的patch
function 。
def main_tester(command):
fake_command()
capturedoutput = io.StringIO()
sys.stdout = capturedoutput
with patch('sys.argv', command.split(" ")):
from SIESTAstepper import __main__ as rtmain
sys.stdout = sys.__stdout__
return capturedoutput.getvalue()
问题是,它返回一个空字符串""
而不是捕获的 output。
如果您愿意查看完整的项目,代码来自这里。
您的__main__
模块可能不应该无条件地调用main
function。 通常的做法是把它放在if __name__ == '__main__':
块中。 它是该平台上观看次数最多的线程之一。
如果你把main
调用放在 if 语句后面,你可以安全地从你的__main__
模块导入,而不会导致main
function 的执行。
然后你可以正确地测试main
因为你可以在你的测试模块中导入它并简单地用你想要的任何 arguments 调用它来进行测试。
要测试特定的打印语句,您可以在正在测试的模块中修补/模拟打印 function 。 例如这样的事情:
from unittest.mock import MagicMock, patch
@patch("module_being_tested.print")
def test_some_function_that_should_call_print(mock_print: MagicMock) -> None:
...
some_function(some_argument)
mock_print.assert_called_once_with(
"A string it should have been called with"
)
在您的评论中,您提到您是单元测试的新手。 我只是想提请您注意单元测试的定义。 因为似乎main_tester
应该测试甚至不属于__main__.main
function 的行为。 您应该确保实际上将您正在测试的单元(函数)与所有其他代码隔离开来。 这就是 mocking 派上用场的地方。
在测试main
时,实际上应该只测试main
而不是main
调用的其他函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.