Ответ 1
Стандартная mocking framework в Python 3.3+ unittest.mock; вы можете использовать это для файловой системы или чего-то еще.
Вы также можете просто рулонировать его, насмехаясь через патч обезьяны:
Тривиальный пример:
import os.path
os.path.isfile = lambda path: path == '/path/to/testfile'
Немного больше (непроверено):
import classtobetested
import unittest
import contextlib
@contextlib.contextmanager
def monkey_patch(module, fn_name, patch):
unpatch = getattr(module, fn_name)
setattr(module, fn_name)
try:
yield
finally:
setattr(module, fn_name, unpatch)
class TestTheClassToBeTested(unittest.TestCase):
def test_with_fs_mocks(self):
with monkey_patch(classtobetested.os.path,
'isfile',
lambda path: path == '/path/to/file'):
self.assertTrue(classtobetested.testable())
В этом примере фактические mocks тривиальны, но вы можете поддержать их тем, что имеет состояние, которое может представлять действия файловой системы, такие как сохранение и удаление. Да, это все немного уродливо, так как оно влечет за собой репликацию/имитацию базовой файловой системы в коде.
Обратите внимание, что вы не можете монтировать патчи python для обезьян. Это сказано...
Для более ранних версий, если это вообще возможно, используйте стороннюю библиотеку, я бы пошел с Майклом Фоудом удивительным Mock, что теперь unittest.mock
в стандартной библиотеке с 3.3+ благодаря PEP 0417, и вы можете получить его на PyPI для Python 2.5+. И он может высмеивать встроенные функции!