Tecniche di Mocking in Unittest: Simulazione delle Dipendenze
Testare codice che dipende da servizi esterni, configurazioni o che presenta effetti collaterali può risultare complesso. Il mocking è una tecnica potente che simula il comportamento di interazioni reali complesse all'interno dei test, senza la loro complessità e imprevedibilità.
Ad esempio, se è necessario testare un servizio di cambio valuta, una possibilità potrebbe essere quella di utilizzare fondi propri per simulare le transazioni e osservare i risultati. Tuttavia, questo metodo può essere rischioso e costoso. Un'alternativa più efficiente e priva di rischi è utilizzare il mocking per emulare il processo di invio di denaro.
Test di un servizio di trasferimento di denaro
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
Approccio al test:
- Mock dei saldi dei conti: usare il mocking per simulare diversi stati dei conti, come fondi insufficienti o fondi abbondanti, per testare come il metodo di trasferimento risponde;
- Verifica delle transazioni: confermare che gli importi appropriati vengano addebitati e accreditati sui rispettivi conti durante un trasferimento;
- Gestione delle eccezioni: assicurarsi che il metodo gestisca correttamente gli scenari in cui il trasferimento non può essere completato.
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
Il tuo compito è scrivere test unitari per la classe MoneyTransferService utilizzando il framework unittest e unittest.mock. Devi:
- Creare una classe di test che eredita da
unittest.TestCase; - Utilizzare
MagicMockper simulare oggetti account; - Implementare due metodi di test con questi nomi esatti:
test_successful_transfer;test_failed_transfer_due_to_insufficient_funds.
- In
test_successful_transfer, testare un trasferimento in cui la fonte dispone di fondi sufficienti e verificare sia il valore restituito sia i saldi aggiornati; - In
test_failed_transfer_due_to_insufficient_funds, testare un trasferimento in cui la fonte non dispone di fondi sufficienti, verificare che venga sollevato unValueErrore controllare che i saldi rimangano invariati.
Nota: I nomi delle funzioni di test devono corrispondere esattamente a quelli sopra indicati. I tuoi test devono verificare il comportamento controllando direttamente valori e gestione delle eccezioni, senza utilizzare regex o pattern matching.
Soluzione
Grazie per i tuoi commenti!
single
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione
Can you explain how mocking helps in testing services with side effects?
What are some best practices for using MagicMock in unit tests?
Can you show how to extend these tests for additional scenarios, like negative transfer amounts?
Fantastico!
Completion tasso migliorato a 3.13
Tecniche di Mocking in Unittest: Simulazione delle Dipendenze
Scorri per mostrare il menu
Testare codice che dipende da servizi esterni, configurazioni o che presenta effetti collaterali può risultare complesso. Il mocking è una tecnica potente che simula il comportamento di interazioni reali complesse all'interno dei test, senza la loro complessità e imprevedibilità.
Ad esempio, se è necessario testare un servizio di cambio valuta, una possibilità potrebbe essere quella di utilizzare fondi propri per simulare le transazioni e osservare i risultati. Tuttavia, questo metodo può essere rischioso e costoso. Un'alternativa più efficiente e priva di rischi è utilizzare il mocking per emulare il processo di invio di denaro.
Test di un servizio di trasferimento di denaro
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
Approccio al test:
- Mock dei saldi dei conti: usare il mocking per simulare diversi stati dei conti, come fondi insufficienti o fondi abbondanti, per testare come il metodo di trasferimento risponde;
- Verifica delle transazioni: confermare che gli importi appropriati vengano addebitati e accreditati sui rispettivi conti durante un trasferimento;
- Gestione delle eccezioni: assicurarsi che il metodo gestisca correttamente gli scenari in cui il trasferimento non può essere completato.
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
Il tuo compito è scrivere test unitari per la classe MoneyTransferService utilizzando il framework unittest e unittest.mock. Devi:
- Creare una classe di test che eredita da
unittest.TestCase; - Utilizzare
MagicMockper simulare oggetti account; - Implementare due metodi di test con questi nomi esatti:
test_successful_transfer;test_failed_transfer_due_to_insufficient_funds.
- In
test_successful_transfer, testare un trasferimento in cui la fonte dispone di fondi sufficienti e verificare sia il valore restituito sia i saldi aggiornati; - In
test_failed_transfer_due_to_insufficient_funds, testare un trasferimento in cui la fonte non dispone di fondi sufficienti, verificare che venga sollevato unValueErrore controllare che i saldi rimangano invariati.
Nota: I nomi delle funzioni di test devono corrispondere esattamente a quelli sopra indicati. I tuoi test devono verificare il comportamento controllando direttamente valori e gestione delle eccezioni, senza utilizzare regex o pattern matching.
Soluzione
Grazie per i tuoi commenti!
single