Mockingtechnieken in Unittest: Het Simuleren van Afhankelijkheden
Het testen van code die afhankelijk is van externe diensten, configuraties of bijwerkingen heeft, kan uitdagend zijn. Mocking is een krachtige techniek die het gedrag van complexe interacties uit de echte wereld binnen tests simuleert, zonder hun complexiteit en onvoorspelbaarheid.
Stel bijvoorbeeld dat je een geldwisseldienst moet testen. Een optie zou kunnen zijn om je eigen geld te gebruiken om transacties te simuleren en de uitkomsten te observeren. Deze methode kan echter riskant en kostbaar zijn. Een efficiënter en risicovrij alternatief is het gebruik van mocking om het proces van geld overmaken na te bootsen.
Testen van een Geldtransferservice
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
De Testaanpak:
- Mock de Rekeningbalansen: gebruik mocking om verschillende rekeningtoestanden te simuleren, zoals onvoldoende saldo of voldoende saldo, om te testen hoe de transfermethode reageert;
- Transacties Verifiëren: bevestig dat de juiste bedragen worden afgeschreven en bijgeschreven op de respectievelijke rekeningen tijdens een overboeking;
- Afhandelen van Excepties: zorg ervoor dat de methode scenario's waarin de overboeking niet kan worden voltooid correct afhandelt.
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)
Swipe to start coding
Je taak is om unittests te schrijven voor de MoneyTransferService-klasse met behulp van het unittest-framework en unittest.mock. Je moet:
- Een testklasse aanmaken die erft van
unittest.TestCase; MagicMockgebruiken om accountobjecten te simuleren;- Twee testmethoden implementeren met exact deze namen:
test_successful_transfer;test_failed_transfer_due_to_insufficient_funds.
- In
test_successful_transfereen overboeking testen waarbij de bron voldoende saldo heeft, en zowel de returnwaarde als de bijgewerkte saldi controleren; - In
test_failed_transfer_due_to_insufficient_fundseen overboeking testen waarbij de bron onvoldoende saldo heeft, verifiëren dat eenValueErrorwordt opgegooid, en controleren dat de saldi ongewijzigd blijven.
Let op: De namen van de testfuncties moeten exact overeenkomen met bovenstaande. Je tests moeten het gedrag verifiëren door direct waarden en uitzonderingafhandeling te controleren, niet door regex of patroonherkenning te gebruiken.
Oplossing
Bedankt voor je feedback!
single
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
Geweldig!
Completion tarief verbeterd naar 3.13
Mockingtechnieken in Unittest: Het Simuleren van Afhankelijkheden
Veeg om het menu te tonen
Het testen van code die afhankelijk is van externe diensten, configuraties of bijwerkingen heeft, kan uitdagend zijn. Mocking is een krachtige techniek die het gedrag van complexe interacties uit de echte wereld binnen tests simuleert, zonder hun complexiteit en onvoorspelbaarheid.
Stel bijvoorbeeld dat je een geldwisseldienst moet testen. Een optie zou kunnen zijn om je eigen geld te gebruiken om transacties te simuleren en de uitkomsten te observeren. Deze methode kan echter riskant en kostbaar zijn. Een efficiënter en risicovrij alternatief is het gebruik van mocking om het proces van geld overmaken na te bootsen.
Testen van een Geldtransferservice
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
De Testaanpak:
- Mock de Rekeningbalansen: gebruik mocking om verschillende rekeningtoestanden te simuleren, zoals onvoldoende saldo of voldoende saldo, om te testen hoe de transfermethode reageert;
- Transacties Verifiëren: bevestig dat de juiste bedragen worden afgeschreven en bijgeschreven op de respectievelijke rekeningen tijdens een overboeking;
- Afhandelen van Excepties: zorg ervoor dat de methode scenario's waarin de overboeking niet kan worden voltooid correct afhandelt.
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)
Swipe to start coding
Je taak is om unittests te schrijven voor de MoneyTransferService-klasse met behulp van het unittest-framework en unittest.mock. Je moet:
- Een testklasse aanmaken die erft van
unittest.TestCase; MagicMockgebruiken om accountobjecten te simuleren;- Twee testmethoden implementeren met exact deze namen:
test_successful_transfer;test_failed_transfer_due_to_insufficient_funds.
- In
test_successful_transfereen overboeking testen waarbij de bron voldoende saldo heeft, en zowel de returnwaarde als de bijgewerkte saldi controleren; - In
test_failed_transfer_due_to_insufficient_fundseen overboeking testen waarbij de bron onvoldoende saldo heeft, verifiëren dat eenValueErrorwordt opgegooid, en controleren dat de saldi ongewijzigd blijven.
Let op: De namen van de testfuncties moeten exact overeenkomen met bovenstaande. Je tests moeten het gedrag verifiëren door direct waarden en uitzonderingafhandeling te controleren, niet door regex of patroonherkenning te gebruiken.
Oplossing
Bedankt voor je feedback!
single