如何在 python 中模拟 sys.platform 的值

How can I mock the value of sys.platform in python

我的目标是在我的单元测试中模拟 python 中 sys.platform 的值是 linux 而不是 win32。我发现有些人使用 mock.patch 但这并没有改变 sys.platform 的值用于 python 会话的其余执行。

有没有办法在 python 会话中永远模拟该值?

谢谢

解决方法: 我找到了解决这个问题的方法。问题是我在一个脚本中嘲笑 sys.platform 而在另一个脚本中我是来自 sys 的 importint 平台。这对 python 来说不是一回事,我得到了平台的另一个价值。

我解决这个问题的方法是将整个路径移动到平台: module_1.submodule_1.platform = mock.MagicMock(return_value='whatever')

希望这就是您要找的东西,这是我能够模拟平台的方式(运行 在 Mac 上):

myfunc.py

import sys

# function that I am testing
def print_os():
    if sys.platform == "win32":
        return "We are Windows"
    elif sys.platform == "darwin":
        return "We are Darwin"
    elif sys.platform == "linux":
        return "We are Linux"

myfunc_test.py

import unittest
from unittest.mock import patch

import myfunc


@patch('sys.platform', 'linux')
class TestOS(unittest.TestCase):
    def test_print_os(self):
        self.assertEqual(myfunc.print_os(), "We are Linux")

if __name__ == '__main__':
    unittest.main()

测试:

$ python -m unittest -v myfunc_test.py
test_print_os (main_test.TestOS) ... ok

----------------------------------------------------------------------
Ran 1 test in 0.000s

OK