我今天也面临同样的情况。经过一番犹豫,我找到了一种不同的方法来解决它。
起初,我的函数如下所示:
def reboot_and_balabala(args):
os.system('do some prepare here')
os.system('reboot')
sys.exit(0)
我希望调用 os.system 的第一次调用,否则不会生成本地文件,我无法验证它。但我真的不希望调用 os.system 的第二次调用,哈哈。
起初,我有一个类似于以下的单元测试:
def test_reboot_and_balabala(self):
with patch.object(os, 'system') as mock_system:
# do some mock setup on mock_system, this is what I looked for
# but I do not found any easy and clear solution
with patch.object(sys, 'exit') as mock_exit:
my_lib.reboot_and_balabala(...)
# assert mock invoke args
# check generated files
但最后,我意识到,在调整代码后,我有一个更好的代码结构和单元测试,通过以下方式:
def reboot():
os.system('reboot')
sys.exit(0)
def reboot_and_balabala(args):
os.system('do some prepare here')
reboot()
然后我们可以通过以下方式测试这些代码:
def test_reboot(self):
with patch.object(os, 'system') as mock_system:
with patch.object(sys, 'exit') as mock_exit:
my_lib.reboot()
mock_system.assert_called_once_with('reboot')
mock_exit.assert_called_once_with(0)
def test_reboot_and_balabala(self):
with patch.object(my_lib, 'reboot') as mock_reboot:
my_lib.reboot_and_balabala(...)
# check generated files here
mock_reboot.assert_called_once()
这不是问题的直接答案。但我认为这是非常鼓舞人心的。