Contenu du cours
Concepts Avancés de Python
Concepts Avancés de Python
Détails du Mock
Dans le chapitre précédent, nous avons vu l'importance d'utiliser Mock dans les tests. Maintenant, examinons de plus près les différentes capacités et clarifions les aspects qui étaient flous.
Introduction à MagicMock
MagicMock est une implémentation incroyablement polyvalente de Mock qui prend en charge les méthodes magiques. Vous pouvez l'utiliser pour imiter le comportement d'objets complexes dans vos tests comme nous l'avons vu dans le chapitre précédent.
from unittest.mock import MagicMock
import unittest
class BankAccount:
def __init__(self, id):
self.id = id
self.balance = self.get_account_balance(id)
def get_account_balance(self, id):
# Simulates a database call
pass
class TestBankAccount(unittest.TestCase):
def test_balance_retrieval(self):
account = BankAccount(1)
account.get_account_balance = MagicMock(return_value=1000)
self.assertEqual(account.balance, 1000)
Dans cet exemple, MagicMock est utilisé pour simuler la méthode get_account_balance
, qui récupérerait normalement des données d'une base de données.
Utilisation de mock.patch
@mock.patch est utilisé pour remplacer temporairement les implémentations réelles des objets dans votre code.
Imaginez une fonction qui vérifie les identifiants d'utilisateur contre une base de données. Vous pouvez utiliser mock.patch pour éviter d'accéder à la base de données réelle :
from unittest.mock import patch
import unittest
def authenticate(username, password):
# Assume this function checks credentials against a database
pass
class TestAuthentication(unittest.TestCase):
@patch('module_containing.authenticate')
def test_login(self, mock_auth):
mock_auth.return_value = True
response = authenticate('user', 'pass')
self.assertTrue(response)
Mocking avec le gestionnaire de contexte
Parfois, il est préférable d'utiliser patch() comme gestionnaire de contexte plutôt que comme décorateur, en particulier lorsque :
- vous avez besoin de simuler un objet pour seulement une partie du test ;
- ou lorsque l'utilisation excessive de décorateurs ou de paramètres réduit la clarté de vos tests.
from unittest.mock import patch
import unittest
class BankAccount:
def __init__(self, id):
self.id = id
self.balance = self.get_account_balance(id)
def get_account_balance(self, id):
# Simulates a database call
return 100 # Dummy return value for demonstration
class TestBankAccount(unittest.TestCase):
def test_balance_retrieval(self):
with patch('__main__.BankAccount.get_account_balance', return_value=1000):
account = BankAccount(1)
self.assertEqual(account.balance, 1000)
Pytest Monkey Patch
Le fixture monkeypatch dans Pytest vous permet de modifier temporairement des classes, des modules ou des environnements pendant un test.
import os
import pytest
def test_api_url(monkeypatch):
# Set the API_URL environment variable to a test URL
monkeypatch.setenv('API_URL', 'https://testapi.com')
# Now check that the environment variable was set correctly
assert os.environ['API_URL'] == 'https://testapi.com'
Le fixture monkeypatch vous permet de modifier et de gérer en toute sécurité l'environnement pendant le test sans provoquer d'effets secondaires en dehors de la portée du test.
1. Lequel des extraits de code suivants simule correctement la méthode get_balance pour retourner 500 ?
2. Que vérifie le test suivant ?
Merci pour vos commentaires !