Cos'è mock?

mock è un modulo che fa parte di unittest. Per usarlo effettivamente, c'è bisogno di conoscere e di capire mock.patch e mock.MagicMock. Con questi è possibile di rimpiazire qualiasi classe o metodo per rendere i test più facile.

Consideriamo questo codice :

import subprocess

def metodo_1():
  return 1

class A:

  def cominciare(self):
    subprocess.popen(
      [
        "applicazione",
        "argomento_1",
        "argomento_2",
      ]
    )

Consideriamo questo test :

import unittest

class TestiDiA(unittest.TestCase):
  @mock.patch("subprocess.popen")
  def test_il_metodo(self, mock_popen: unittest.mock.MagicMock):
    # Configurare
    sotto_testo = A()
    # Eseguire
    sotto_testo.cominciare()
    # Verificare
    mock_popen.called_with(
      [
        "applicazione",
        "argomento_1",
        "argomento_2",
      ]
    )

Consideriamo questo codice :

from a import metodo_1

def stampare_metodo_1():
  print(metodo_1())

Consideriamo questo test :

import unittest

class TestiDiMetodo1(unittest.TestCase):
  @mock.patch("b.metodo_1")
  @mock.patch("b.print")
  def test_il_metodo(self, mock_print: unittest.mock.MagicMock, mock_metodo_1: unittest.mock.MagicMock):
    # Configurare
    mock_metodo_1.return_value = 2
    # Eseguire
    stampare_methodo_1()
    # Verificare
    mock_print.called_with(2)

Noto che ho già avuto problemi con mock.patch. Avevo cambiato il livello dei log e mock non funzionava più. Cambiando il livello ancora, il mock.patch si è messo a funzionario di nuovo. Facevo un sudo docker compose --progress=plain -f docker-compose.yml build a quel momento.