Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Tecniche di Mocking in Unittest: Simulazione delle Dipendenze | Padronanza del Framework Unittest
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
Programmazione Strutturale in Python

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

  1. 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;
  2. Verifica delle transazioni: confermare che gli importi appropriati vengano addebitati e accreditati sui rispettivi conti durante un trasferimento;
  3. 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)
Compito

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 MagicMock per 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 un ValueError e 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

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 5. Capitolo 4
single

single

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

close

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

  1. 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;
  2. Verifica delle transazioni: confermare che gli importi appropriati vengano addebitati e accreditati sui rispettivi conti durante un trasferimento;
  3. 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)
Compito

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 MagicMock per 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 un ValueError e 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

Switch to desktopCambia al desktop per esercitarti nel mondo realeContinua da dove ti trovi utilizzando una delle opzioni seguenti
Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 5. Capitolo 4
single

single

some-alt