Python
Mocking
Unit Testing
Software Development
Programming

Python Mocking a function from an imported module

Interview Questions practice on Codemia

Over 8,000 real interview questions from top companies, searchable by company and role.

Browse interview questions

Mocking functions is a crucial aspect of testing in Python, allowing developers to isolate the systems under test and replace parts of the system with mock objects. This is particularly useful when testing functions that depend on external services, databases, or modules that are difficult to set up or slow to respond. The Python `unittest.mock` module provides powerful tools to support the mocking of functions from imported modules.

Understanding Mocking

Mocking involves substituting real objects in your system with mock objects, which mimic the behavior of the real ones. By doing this, you ensure your tests are focused on the code you want to test without dependencies skewing results. This is essential for unit testing where a function relies on non-deterministic or external functions.

Mocking with `unittest.mock`

Python's `unittest.mock` library is designed to facilitate replacing segments of your system under test with mock objects. Here is a step-by-step guide to mocking a function from an imported module using `unittest.mock`.

Step 1: Setting Up Your Development Environment

Before we dive into the examples, ensure you have the necessary setup. If you're using a standard Python environment, you can install any required packages using pip. However, for basic mocking with `unittest.mock`, no external installations are required as it's part of the Python Standard Library (from Python 3.3 onward).

  • Patch Path: Note that `patch()` is called with the path where the function is used, not where it is defined. Here, `external_module.fetch_data_from_api` is imported into `main_module`, so we patch `main_module.fetch_data_from_api`.
  • Mocking Behavior: We configure the `mock_fetch` to return a known value. This allows us to test `get_data` without fetching real data from any external source.
  • Assertions: We ensure that the `get_data` function behaves as expected with the mocked return value.
  • Isolation: Easily isolate the function under test from external dependencies.
  • Control: Mocking allows developers to test against known output scenarios, including errors and edge cases.
  • Performance: Tests leveraging mocks are faster as they avoid network/database calls.
  • Import Paths: Be vigilant about the path provided to `patch()`. It must match where the function is being used after imports.
  • State Persistence: Remember that mocks need to be stateless between tests to avoid test contamination.

Related reading
Free course
Beginner
7 lessons
2 hours
Tackling System Design Interview Problems

A short course that equips you with the skills to approach system design interviews methodically.

Start the free course
Track what you have practised

A free account saves your progress, solutions and study plan across every problem on Codemia.

Interview Questions practice on Codemia

Over 8,000 real interview questions from top companies, searchable by company and role.

Browse interview questions

All Rights Reserved.