[英]Unit test: patching os join overwrites os join in test file
我正在为使用os.makedirs
和os.path.join
创建文件夹的函数编写单元测试。 当我尝试模拟 BuilddataHelpers 类中使用的特定 os.path.join 时,它还会修补测试文件中的os.path.join
。 我怎样才能专门修补os.path.join
同时仍然使用被测试的文件中os.path.join
在测试文件?
数据管理器/builddatahelpers.py
import os
PATH = 'not/test/data/either'
class BuilddataHelpers:
def create_folder(self, folder_name):
create_folder_path = os.path.join(PATH, folder_name)
os.makedirs(create_folder_path, exist_ok = True)
return path
数据管理器/数据管理器.py
class DataManager(BuilddataHelpers):
...
test_builddatahelpers.py
import os
class TestBuilddataHelpers(unittest.TestCase):
global TEST_PATH
TEST_PATH = 'tests/data'
def setUp(self):
super(TestBuilddataHelpers, self).setUp()
self.dm = DataManager()
@patch('datamanager.builddatahelpers.os.path.join', return_value=TEST_PATH)
def test_create_folder_structure_on_ftp(self, mock_os_join):
folder_name = 'test_folder'
self.dm.create_folder(folder_name)
self.assertTrue(os.path.exists(os.path.join(TEST_PATH, folder_name)))
print('SUBFOLDER PATH: ' , os.path.join('not', 'test', 'data'))
输出子文件SUBFOLDER PATH: tests/data
。 由于未修补os.makedirs
该文件夹仍会创建。
在您测试的代码中,您执行import os
,这意味着将使用os.path.join
而不是本地引用。 所以如果你这样做:
@patch('datamanager.builddatahelpers.os.path.join', return_value=TEST_PATH)
def test_create_folder_structure_on_ftp(self, mock_os_join):
...
这与编写完全相同:
@patch('os.path.join', return_value=TEST_PATH)
def test_create_folder_structure_on_ftp(self, mock_os_join):
...
只有在测试代码中使用了from x import y
,第一个版本才有意义。 在您的情况下, os.path.join
将为使用它的所有模块修补。 如果要使用原始os.path.join
,则必须将其缓存在某处。 一种可能性是只使用:
from os.path import join
...
@patch('os.path.join', return_value=TEST_PATH)
def test_create_folder_structure_on_ftp(self, mock_os_join):
folder_name = 'test_folder'
self.dm.create_folder(folder_name)
self.assertTrue(os.path.exists(join(TEST_PATH, folder_name)))
print('SUBFOLDER PATH: ' , join('not', 'test', 'data'))
join
保存的对os.path.join
的本地引用不会被修补。 您还可以将其缓存为类变量:
import os
class TestBuilddataHelpers(unittest.TestCase):
TEST_PATH = 'tests/data'
join = os.path.join
...
self.assertTrue(os.path.exists(self.join(TEST_PATH, folder_name)))
这将具有相同的效果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.