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