@@ -601,6 +601,9 @@ def insert_missing_modules(modules: Dict[str, ModuleType], module_name: str) ->
601
601
otherwise "src.tests.test_foo" is not importable by ``__import__``.
602
602
"""
603
603
module_parts = module_name .split ("." )
604
+ child_module : Union [ModuleType , None ] = None
605
+ module : Union [ModuleType , None ] = None
606
+ child_name : str = ""
604
607
while module_name :
605
608
if module_name not in modules :
606
609
try :
@@ -610,13 +613,22 @@ def insert_missing_modules(modules: Dict[str, ModuleType], module_name: str) ->
610
613
# ourselves to fall back to creating a dummy module.
611
614
if not sys .meta_path :
612
615
raise ModuleNotFoundError
613
- importlib .import_module (module_name )
616
+ module = importlib .import_module (module_name )
614
617
except ModuleNotFoundError :
615
618
module = ModuleType (
616
619
module_name ,
617
620
doc = "Empty module created by pytest's importmode=importlib." ,
618
621
)
622
+ else :
623
+ module = modules [module_name ]
624
+ if child_module :
625
+ # Add child attribute to the parent that can reference the child
626
+ # modules.
627
+ if not hasattr (module , child_name ):
628
+ setattr (module , child_name , child_module )
619
629
modules [module_name ] = module
630
+ # Keep track of the child module while moving up the tree.
631
+ child_module , child_name = module , module_name .rpartition ("." )[- 1 ]
620
632
module_parts .pop (- 1 )
621
633
module_name = "." .join (module_parts )
622
634
0 commit comments