3

在脚本的开头,我使用platform.systemandplatform.release来确定脚本在哪个操作系统和版本上运行(所以它知道它的数据在 Mac 上的应用程序支持中,在类 unix 和非 Mac 的 unix 上的主页中,在 windows 上的 appdata <= XP 和 Windows >= Vista 上的 appdata/roaming)。我想测试我的系列ifs、elifs 和elses 是什么决定了操作系统和版本,但我只能访问 Mac 10.6.7、一些未知版本的 Linux 和 Windows 7。有没有办法喂platform假系统和发布信息,以便我可以确定 XP、Solaris 等无需安装即可正确处理脚本?

4

4 回答 4

2

也许像

>>> platform.system = lambda: "whatever"
>>> platform.system()
'whatever'
于 2013-01-04T15:43:28.260 回答
1

您可能想探索模拟 platform测试。或者,您可以直接使用猴子补丁platform,甚至sys.modules直接混淆以覆盖默认platform模块,但是模拟已经被设计为自包含的并且还具有在您的代码中非常清楚地显示什么是测试仪器和不是测试仪器的好处,所以你不要意外地在您的生产代码中发布测试功能。

于 2013-01-04T15:42:02.313 回答
1

您可以创建初始化函数以将这些变量作为参数,因此很容易在测试中欺骗它们

于 2013-01-04T15:42:23.080 回答
0

对我来说,直接platform.system用 pytest-mock 打补丁是行不通的。不过,一个简单的技巧是将这些信息的检索抽象到您自己的实用程序函数中(这次您可以成功地使用 pytest-mock 进行修补)。

因此,在您的实现模块/类中:

def _get_system() -> str:
    return platform.system().lower()

def _is_windows() -> bool:
    return _get_system() == 'windows'

在你的测试中,这里使用 pytest + pytest-mock:

def test_win_no_pad_code():
    with patch('module_name._get_system', MagicMock(return_value='windows')):
        assert module_name._is_windows()

这是使用模块的一种方法,但您可以使用类来代替。

于 2021-01-21T18:07:17.663 回答