os.name
的正确方法是什么?我正在尝试对使用os.name
构建适合平台的字符串的一些跨平台代码进行单元测试。我在Windows机器上运行,但想测试可以在posix或windows上运行的代码。
我试过了:
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'
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
的全局范围内。如果import
中的'os'为test_code.py
,那么我们将始终获得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
是属性而不是具有返回值的方法。
编辑: 澄清以回应评论
os.name
可能会变得混乱,例如断言被提出os.name
更改路径。虽然测试将在Windows和posix机器上运行,但我希望能够完全覆盖,而不需要在每次进行小编辑时为机器提供资源。答案 0 :(得分:2)
根据Where to patch,您应该在os_name
中修补production_code
。通过
from os import name as os_name
您在名为os.name
的{{1}}模块中创建production_code
引用:之后(在导入时加载)更改os_name
无效{{1}参考。
os.name