The before code calls an external payment gateway directly, making tests unreliable and slow. The after code uses mocking to simulate the external call, isolating the service logic and enabling fast, reliable unit tests.
### Before: No unit test, direct call to external service
class PaymentService:
def charge(self, user_id, amount):
# Calls external payment gateway
response = external_gateway.charge(user_id, amount)
return response.success
### After: Unit test with mock for external dependency
import unittest
from unittest.mock import Mock, patch
class PaymentService:
def charge(self, user_id, amount):
response = external_gateway.charge(user_id, amount)
return response.success
class TestPaymentService(unittest.TestCase):
@patch('__main__.external_gateway.charge')
def test_charge_success(self, mock_charge):
mock_charge.return_value = Mock(success=True)
service = PaymentService()
result = service.charge('user123', 100)
self.assertTrue(result)
if __name__ == '__main__':
unittest.main()