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
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