Skip to content

Commit e27d9d8

Browse files
committed
Reload original modules in dynamic patcher cleanup
- avoids them to still reference the fake file system - see #356
1 parent 5c2a381 commit e27d9d8

File tree

2 files changed

+25
-8
lines changed

2 files changed

+25
-8
lines changed

Diff for: pyfakefs/fake_filesystem_unittest.py

+11-8
Original file line numberDiff line numberDiff line change
@@ -305,9 +305,9 @@ def __init__(self, additional_skip_names=None, patch_path=True,
305305
self._skipNames.discard('path')
306306
self._skipNames.discard('genericpath')
307307

308-
self._modules_to_reload = [tempfile]
308+
self.modules_to_reload = [tempfile]
309309
if modules_to_reload is not None:
310-
self._modules_to_reload.extend(modules_to_reload)
310+
self.modules_to_reload.extend(modules_to_reload)
311311
self._use_dynamic_patch = use_dynamic_patch
312312

313313
# Attributes set by _findModules()
@@ -352,7 +352,7 @@ def __init__(self, additional_skip_names=None, patch_path=True,
352352
self._stubs = None
353353
self.fs = None
354354
self.fake_open = None
355-
self._fake_modules = {}
355+
self.fake_modules = {}
356356
self._dyn_patcher = None
357357

358358
# _isStale is set by tearDown(), reset by _refresh()
@@ -396,8 +396,8 @@ def _refresh(self):
396396

397397
self.fs = fake_filesystem.FakeFilesystem()
398398
for name in self._fake_module_classes:
399-
self._fake_modules[name] = self._fake_module_classes[name](self.fs)
400-
self._fake_modules['path'] = self._fake_modules['os'].path
399+
self.fake_modules[name] = self._fake_module_classes[name](self.fs)
400+
self.fake_modules['path'] = self.fake_modules['os'].path
401401
self.fake_open = fake_filesystem.FakeFileOpen(self.fs)
402402

403403
self._isStale = False
@@ -419,12 +419,12 @@ def setUp(self, doctester=None):
419419
self._stubs.smart_set(builtins, 'open', self.fake_open)
420420
for name in self._modules:
421421
for module, attr in self._modules[name]:
422-
self._stubs.smart_set(module, attr, self._fake_modules[name])
422+
self._stubs.smart_set(module, attr, self.fake_modules[name])
423423

424424
self._dyn_patcher = DynamicPatcher(self)
425425
sys.meta_path.insert(0, self._dyn_patcher)
426426

427-
for module in self._modules_to_reload:
427+
for module in self.modules_to_reload:
428428
if module.__name__ in sys.modules:
429429
reload(module)
430430

@@ -465,7 +465,7 @@ class DynamicPatcher(object):
465465
def __init__(self, patcher):
466466
self._patcher = patcher
467467
self.sysmodules = {}
468-
self.modules = self._patcher._fake_modules
468+
self.modules = self._patcher.fake_modules
469469
if 'path' in self.modules:
470470
self.modules['os.path'] = self.modules['path']
471471
del self.modules['path']
@@ -483,6 +483,9 @@ def __init__(self, patcher):
483483
def cleanup(self):
484484
for module in self.sysmodules:
485485
sys.modules[module] = self.sysmodules[module]
486+
for module in self._patcher.modules_to_reload:
487+
if module.__name__ in sys.modules:
488+
reload(module)
486489

487490
def needs_patch(self, name):
488491
"""Check if the module with the given name shall be replaced."""

Diff for: tests/fake_filesystem_unittest_test.py

+14
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import glob
2323
import io
2424
import os
25+
import multiprocessing
2526
import shutil
2627
import sys
2728
import unittest
@@ -353,5 +354,18 @@ def test_test_case_type(self):
353354
fake_filesystem_unittest.TestCaseMixin)
354355

355356

357+
class TestTempFileReload(unittest.TestCase):
358+
"""Regression test for #356 to make sure that reloading the tempfile
359+
does not affect other tests."""
360+
361+
def test_fakefs(self):
362+
with Patcher() as patcher:
363+
patcher.fs.CreateFile('/mytempfile', contents='abcd')
364+
365+
def test_value(self):
366+
v = multiprocessing.Value('I', 0)
367+
self.assertEqual(v.value, 0)
368+
369+
356370
if __name__ == "__main__":
357371
unittest.main()

0 commit comments

Comments
 (0)