unittest.mock.patch helps you replace parts of your code during tests. This lets you control what those parts do, so you can test your code easily.
unittest.mock.patch in PyTest
from unittest.mock import patch @patch('module_name.function_name') def test_function(mock_function): mock_function.return_value = expected_value # your test code here
Use the full path to the function or object you want to replace, like 'package.module.function'.
The patched object is replaced only during the test and restored after it finishes.
from unittest.mock import patch @patch('math.sqrt') def test_sqrt(mock_sqrt): mock_sqrt.return_value = 3 result = mock_sqrt(9) assert result == 3
from unittest.mock import patch import requests def test_api_call(): with patch('requests.get') as mock_get: mock_get.return_value.status_code = 200 response = requests.get('http://example.com') assert response.status_code == 200
This test replaces requests.get with a mock that returns a response with status_code 404. The test checks if fetch_status returns 404 as expected.
from unittest.mock import patch import requests def fetch_status(url): response = requests.get(url) return response.status_code @patch('requests.get') def test_fetch_status(mock_get): mock_get.return_value.status_code = 404 status = fetch_status('http://fakeurl.com') assert status == 404 print('Test passed') if __name__ == '__main__': test_fetch_status()
Always patch where the function or object is used, not where it is defined.
Remember to set return_value or side_effect on the mock to control its behavior.
Using patch as a decorator or context manager depends on how long you want the mock to last.
unittest.mock.patch lets you replace parts of your code during tests to control behavior.
Use patch to avoid real calls and test your code in isolation.
Patch can be used as a decorator or context manager for flexible mocking.