What if you could test your app without waiting for slow or unreliable external services?
Why Mocking external services in Django? - Purpose & Use Cases
Start learning this pattern below
Jump into concepts and practice - no test required
Imagine testing your Django app that calls an external payment service every time a user makes a purchase.
You have to wait for the real service to respond, and sometimes it's slow or down.
This makes your tests slow and unreliable.
Manually calling real external services during tests is slow and can fail unpredictably.
It also costs money and can cause inconsistent test results if the service changes or is unavailable.
Mocking external services lets you replace real calls with fake ones that return controlled responses instantly.
This makes tests fast, reliable, and safe without depending on outside systems.
response = requests.post('https://payment.example.com/pay', data=payment_data) assert response.status_code == 200
from unittest import mock with mock.patch('requests.post') as mock_post: mock_post.return_value.status_code = 200 response = requests.post('https://payment.example.com/pay', data=payment_data) assert response.status_code == 200
It enables you to test your app's behavior quickly and reliably without real external dependencies.
When testing user signup that sends a confirmation email via an external service, mocking lets you verify the email was "sent" without actually sending it.
Manual external calls in tests are slow and unreliable.
Mocking replaces real calls with fast, fake responses.
This makes tests faster, safer, and consistent.
Practice
Solution
Step 1: Understand the purpose of mocking
Mocking replaces real external calls with fake ones to avoid delays and failures during tests.Step 2: Identify the benefit in testing context
By not making real network calls, tests run faster and are more reliable.Final Answer:
To avoid making real network calls during tests -> Option AQuick Check:
Mocking avoids real calls = A [OK]
- Thinking mocking speeds up the server
- Confusing mocking with deployment
- Assuming mocking generates docs
Solution
Step 1: Understand patch target format
The patch decorator requires the full import path to the function or method to mock.Step 2: Match the correct import path
@patch('myapp.services.external_api_call') correctly specifies the module and function as 'myapp.services.external_api_call'.Final Answer:
@patch('myapp.services.external_api_call') -> Option DQuick Check:
Correct patch path = D [OK]
- Reversing module and function order
- Using incomplete import paths
- Patching the wrong module
from unittest.mock import patch
def get_data():
return external_service_call()
@patch('myapp.services.external_service_call')
def test_get_data(mock_call):
mock_call.return_value = {'status': 'ok'}
result = get_data()
print(result)Solution
Step 1: Understand patch effect on external_service_call
The patch replaces external_service_call with a mock that returns {'status': 'ok'} only inside the decorated function test_get_data.Step 2: Analyze get_data call outside patch scope
get_data() calls external_service_call(), but external_service_call is not defined globally, leading to a NameError.Final Answer:
Error: external_service_call not defined -> Option AQuick Check:
external_service_call undefined outside patch = D [OK]
- Assuming patch affects global scope
- Expecting mock return_value outside patch
- Ignoring NameError due to missing definition
from unittest.mock import patch
def test_api_call():
with patch('myapp.services.external_api_call') as mock_call:
mock_call.return_value = {'success': True}
result = external_api_call()
print(result)Solution
Step 1: Check patch context usage
The patch is applied only inside the with block, but external_api_call is called after it ends.Step 2: Understand effect on mocking
Since external_api_call is called outside the patch block, it is not mocked and runs the real function.Final Answer:
The patch context ends before calling external_api_call -> Option BQuick Check:
Call must be inside patch block = C [OK]
- Calling function outside patch context
- Setting return_value too late
- Assuming patch works globally without context
from unittest.mock import patch
from django.test import Client
@patch('payments.api.call_payment')
def test_payment_failure(mock_call):
mock_call.return_value = {'status': 'error', 'code': 500}
client = Client()
response = client.post('/pay/')
print(response.status_code)
What should you add to the test to check the view's behavior?Solution
Step 1: Understand mocking external payment API
The patch replaces call_payment with a mock returning an error response.Step 2: Verify view handles error but returns HTTP 200
The view should catch the error and respond with HTTP 200 (page loads with error message), not propagate 500.Step 3: Check mock call was made
Asserting mock_call was called confirms the external API was invoked in the view.Final Answer:
Assert mock_call was called once and response.status_code is 200 -> Option CQuick Check:
Mock call checked + 200 response = B [OK]
- Expecting 500 status from view on API error
- Not asserting mock call was made
- Removing patch and making real calls
