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
python91234567class MoneyTransferService:def transfer(self, source_account, destination_account, amount):if source_account.balance < amount:raise ValueError("Insufficient funds")source_account.balance -= amountdestination_account.balance += amountreturn True
The Testing Approach:
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;
Verify Transactions: confirm that the appropriate amounts are debited and credited from the respective accounts during a transfer;
Handle Exceptions: ensure that the method correctly handles scenarios where the transfer cannot be completed.
python9912345678910111213141516171819202122232425262728293031323334import unittestfrom unittest.mock import MagicMockclass 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 balancesself.source_account.balance = 1000self.destination_account.balance = 500# Perform the transfersuccessful = self.transfer_service.transfer(self.source_account, self.destination_account, 200)# Check balancesself.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 balancesself.source_account.balance = 100self.destination_account.balance = 500# Attempt to transfer more than the source balancewith self.assertRaises(ValueError):self.transfer_service.transfer(self.source_account, self.destination_account, 200)# Verify that balances remain unchangedself.assertEqual(self.source_account.balance, 100)self.assertEqual(self.destination_account.balance, 500)
Bedankt voor je feedback!
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.