繁体   English   中英

无法使用 unittest.mock 在 __main__.py 中收听打印 function

[英]Can't listen to print function in __main__.py with unittest.mock

我正在尝试收听来自__main__.pyprint function 。 我使用来自unittest.mockpatch 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM