gpt4 book ai didi

python跨平台测试: mocking os.名称

转载 作者:行者123 更新时间:2023-11-28 17:36:04 42 4
gpt4 key购买 nike

模拟 os.name 的正确方法是什么?

我正在尝试对一些使用 os.name 构建适合平台的字符串的跨平台代码进行单元测试。我在 Windows 机器上运行,但想测试可以在 posix 或 Windows 上运行的代码。

我试过:

生产代码.py

from os import name as os_name

def platform_string():
if 'posix' == os_name:
return 'posix-y path'
elif 'nt' == os_name:
return 'windows-y path'
else:
return 'unrecognized OS'

测试代码.py

import production as production 
from nose.tools import patch, assert_true

class TestProduction(object):
def test_platform_string_posix(self):
"""
"""
with patch.object(os, 'name') as mock_osname:
mock_osname = 'posix'
result = production.platform_string()
assert_true('posix-y path' == result)

这失败了,因为 os 不在 test_code.py 的全局范围内。如果在 test_code.py导入“os”,那么我们将始终得到 os.name=='nt'

我也试过:

def test_platform_string_posix(self):
"""
"""
with patch('os.name', MagicMock(return_value="posix")):
result = production.platform_string()
assert_true('posix-y path' == result)

在测试中,但这似乎不起作用,因为 os.name 是一个属性而不是具有返回值的方法。

编辑:针对评论的澄清

  1. mock docs (1st paragraph)让它看起来像直接猴子修补 os.name 可能会变得困惑,例如提出断言
  2. 我们实际上只是根据os.name 更改路径。虽然测试将在 Windows 和 posix 机器上运行,但我希望能够提供全面覆盖,而无需在每次进行小的编辑时都为机器提供资源。

最佳答案

根据 Where to patch您应该在 production_code 中修补 os_name。通过

from os import name as os_name

您正在 production_code 模块中创建一个名为 os_nameos.name 引用:之后(在导入时加载)更改 os.nameos_name 引用没有影响。

class TestProduction(object):
@patch("production_code.os_name","posix")
def test_platform_string_posix(self):
assert_equal('posix-y path', production.platform_string())

关于python跨平台测试: mocking os.名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30458810/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com