what is the correct way to mock os.name
?
I am trying to unittest some cross-platform code that uses os.name
to build platform-appropriate strings. I am running on a Windows machine but want to test code that can run on either posix or windows.
I've tried:
production_code.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'
test_code.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)
this fails because os
is not in the global scope for the test_code.py
. If 'os' is import
ed in test_code.py
then we will always get os.name=='nt'
.
I've also tried:
def test_platform_string_posix(self):
"""
"""
with patch('os.name', MagicMock(return_value="posix")):
result = production.platform_string()
assert_true('posix-y path' == result)
in the test, but this seems not to work because os.name
is an attribute not a method with a return value.
Aucun commentaire:
Enregistrer un commentaire