我有一個專有的存儲庫格式,我試圖開發一個Python模塊來處理這些存儲庫。回覆格式如下:如何模擬os.listdir在Python中假裝文件和目錄?
/home/X/
|
+ alpha/
|
+ beta/
|
+ project.conf
這裏,X
是一個項目。 alpha
和beta
是該項目中的文件夾,它們代表組在此項目中。 A 羣是此回購的一個容器,它代表的與這個問題真的不相關。 repo X
也有其根級別的文件; project.conf
就是這樣一個文件的例子。
我有一個叫Project
的類,它抽象出X
這樣的項目。 Project
類具有構建內存中表示的方法load()
。
class Project(object):
def load(self):
for entry in os.listdir(self.root):
path = os.path.join(self.root, entry)
if os.path.isdir(path):
group = Group(path)
self.groups.append(group)
group.load()
else:
# process files ...
單元測試的load()
方法通過嘲笑文件系統,我有:
import unittest
from unittest import mock
import Project
class TestRepo(unittest.TestCase):
def test_load_project(self):
project = Project("X")
with mock.patch('os.listdir') as mocked_listdir:
mocked_listdir.return_value = ['alpha', 'beta', 'project.conf']
project.load()
self.assertEqual(len(project.groups), 2)
這確實模擬os.listdir
成功。但我不能哄騙Python將mocked_listdir.return_value
視爲由文件和目錄組成。
如何嘲笑在同一個測試要麼os.listdir
或os.path.isdir
,,使得測試將看到alpha
和beta
的目錄和project.conf
的文件?
你對'os.listdir'所做的任何事情都不會讓其他函數認爲這些名稱命名爲真實文件和目錄。 'os.listdir'只是吐出一堆名字。 – user2357112
我同意@ user2357112所說的。項目中是否有alpha和beta目錄?如果是這樣,你真的不需要模擬'os.path.isdir'。 –
alpha和beta不是該項目的一部分。它們是虛擬目錄,用於解釋由此項目處理的存儲庫的結構。 – Upendra