blob: 93702f28d6d4d02ddc27efa7be044221afe442b6 [file] [log] [blame]
"""A pytest plugin for using pyfakefs as a fixture
When pyfakefs is installed, the "fs" fixture becomes available.
:Usage:
def my_fakefs_test(fs):
fs.create_file('/var/data/xx1.txt')
assert os.path.exists('/var/data/xx1.txt')
"""
import linecache
import tokenize
import py
import pytest
from pyfakefs.fake_filesystem_unittest import Patcher
Patcher.SKIPMODULES.add(pytest)
Patcher.SKIPMODULES.add(py) # Ignore pytest components when faking filesystem
# The "linecache" module is used to read the test file in case of test failure
# to get traceback information before test tear down.
# In order to make sure that reading the test file is not faked,
# we skip faking the module.
# We also have to set back the cached open function in tokenize.
Patcher.SKIPMODULES.add(linecache)
Patcher.SKIPMODULES.add(tokenize)
@pytest.fixture
def fs(request):
""" Fake filesystem. """
if hasattr(request, 'param'):
# pass optional parameters via @pytest.mark.parametrize
patcher = Patcher(*request.param)
else:
patcher = Patcher()
patcher.setUp()
tokenize._builtin_open = patcher.original_open
yield patcher.fs
patcher.tearDown()