Python Pytest, unittest : Mocking out a non-existent imported module

  • Thread starter Thread starter Swamp Thing
  • Start date Start date
  • Tags Tags
    module
Click For Summary
To write a test module that mocks the import statement in the provider module, the key approach is to use `sys.modules` to replace the missing module with a mock. Instead of needing a full dotted path for the module, simply assigning `sys.modules['a_missing_module'] = Mock()` suffices. This method allows for effective testing of the client module that imports the `helper_function` from the provider, even when the actual implementation of the missing module is not included. This technique simplifies the mocking process when only specific functions are imported from a module.
Swamp Thing
Insights Author
Messages
1,039
Reaction score
774
TL;DR
A 'provider' module imports 'a_missing_module'. A 'client' module imports just one function from 'provider'. (It does not import the entire 'provider' module). How can we mock out 'a_missing_module' while testing?
The following provider module imports a_missing_module and implements a helper_function. (I haven't put in any code that actually uses the missing module, but there could be such code in general).
Code:
# provider.py
import a_missing_module

def helper_function():
    return 999

Now this client module imports the helper_function from the provider:
Code:
# client.py
from provider import helper_function

def client_function():
    return helper_function()

How can I write a test module that mocks out the import statement in the provider? In the past, I have used things like sys.modules['client.provider.missing_module'] = Mock() in cases where the client imports an entire provider module, but now it only imports a function from the provider, so I don't know how to proceed.
 
Technology news on Phys.org
Ok, got it after some trial and error. You just do sys.modules['a_missing_module'] = Mock(). You don't need to worry about a full dotted path to the module, unlike the more usual kind of mocking/patching.
 
  • Informative
Likes Wrichik Basu
Learn If you want to write code for Python Machine learning, AI Statistics/data analysis Scientific research Web application servers Some microcontrollers JavaScript/Node JS/TypeScript Web sites Web application servers C# Games (Unity) Consumer applications (Windows) Business applications C++ Games (Unreal Engine) Operating systems, device drivers Microcontrollers/embedded systems Consumer applications (Linux) Some more tips: Do not learn C++ (or any other dialect of C) as a...

Similar threads

Replies
5
Views
15K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 7 ·
Replies
7
Views
5K
  • · Replies 9 ·
Replies
9
Views
1K
  • · Replies 17 ·
Replies
17
Views
3K
Replies
1
Views
2K
  • · Replies 4 ·
Replies
4
Views
5K
  • · Replies 18 ·
Replies
18
Views
1K
  • · Replies 1 ·
Replies
1
Views
1K