@@ -635,6 +635,9 @@ def insert_missing_modules(modules: Dict[str, ModuleType], module_name: str) ->
635
635
otherwise "src.tests.test_foo" is not importable by ``__import__``.
636
636
"""
637
637
module_parts = module_name .split ("." )
638
+ child_module : Union [ModuleType , None ] = None
639
+ module : Union [ModuleType , None ] = None
640
+ child_name : str = ""
638
641
while module_name :
639
642
if module_name not in modules :
640
643
try :
@@ -644,13 +647,22 @@ def insert_missing_modules(modules: Dict[str, ModuleType], module_name: str) ->
644
647
# ourselves to fall back to creating a dummy module.
645
648
if not sys .meta_path :
646
649
raise ModuleNotFoundError
647
- importlib .import_module (module_name )
650
+ module = importlib .import_module (module_name )
648
651
except ModuleNotFoundError :
649
652
module = ModuleType (
650
653
module_name ,
651
654
doc = "Empty module created by pytest's importmode=importlib." ,
652
655
)
656
+ else :
657
+ module = modules [module_name ]
658
+ if child_module :
659
+ # Add child attribute to the parent that can reference the child
660
+ # modules.
661
+ if not hasattr (module , child_name ):
662
+ setattr (module , child_name , child_module )
653
663
modules [module_name ] = module
664
+ # Keep track of the child module while moving up the tree.
665
+ child_module , child_name = module , module_name .rpartition ("." )[- 1 ]
654
666
module_parts .pop (- 1 )
655
667
module_name = "." .join (module_parts )
656
668
0 commit comments