Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Mocking Techniques in Unittest: Simulating Dependencies | Mastering Unittest Framework
Python Advanced Concepts

book
Mocking Techniques in Unittest: Simulating Dependencies

Testing code that depends on external services, configurations, or has side effects can be challenging. Mocking is a powerful technique that simulates the behavior of complex real-world interactions within tests without their complexity and unpredictability.

For instance, if you need to test a money exchange service, one option could involve using your own funds to simulate transactions and observe the outcomes. However, this method can be risky and costly. A more efficient and risk-free alternative is to use mocking to emulate the process of sending money.

Testing a Money Transfer Service

python
class MoneyTransferService:
def transfer(self, source_account, destination_account, amount):
if source_account.balance < amount:
raise ValueError("Insufficient funds")
source_account.balance -= amount
destination_account.balance += amount
return True

The Testing Approach:

  1. Mock the Account Balances: use mocking to simulate different account states, such as insufficient funds or ample funds, to test how the transfer method responds;

  2. Verify Transactions: confirm that the appropriate amounts are debited and credited from the respective accounts during a transfer;

  3. Handle Exceptions: ensure that the method correctly handles scenarios where the transfer cannot be completed.

python
import unittest
from unittest.mock import MagicMock

class TestMoneyTransferService(unittest.junit.TestCase):
def setUp(self):
self.transfer_service = MoneyTransferService()
self.source_account = MagicMock()
self.destination_account = MagicMock()

def test_successful_transfer(self):
# Set up the account balances
self.source_account.balance = 1000
self.destination_account.balance = 500

# Perform the transfer
successful = self.transfer_service.transfer(self.source_account, self.destination_account, 200)
# Check balances
self.assertTrue(successful)
self.assertEqual(self.source_account.balance, 800)
self.assertEqual(self.destination_account.balance, 700)

def test_failed_transfer_due_to_insufficient_funds(self):
# Set up the account balances
self.source_account.balance = 100
self.destination_account.balance = 500

# Attempt to transfer more than the source balance
with self.assertRaises(ValueError):
self.transfer_service.transfer(self.source_account, self.destination_account, 200)
# Verify that balances remain unchanged
self.assertEqual(self.source_account.balance, 100)
self.assertEqual(self.destination_account.balance, 500)

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 5. Hoofdstuk 4

Vraag AI

expand
ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

some-alt