我正在為使用os.makedirs和創建檔案夾的函式撰寫單元測驗os.path.join。當我嘗試模擬 BuilddataHelpers 類中使用的特定 os.path.join 時,它還會修補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未修補,該檔案夾仍被創建。
uj5u.com熱心網友回復:
在您測驗的代碼中,您執行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'))
將不會修補對os.path.join保存在的本地參考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)))
這將具有相同的效果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/331401.html
