Avancerad Mocking i Unittest
I föregående kapitel såg vi vikten av att använda Mock vid testning. Nu ska vi titta närmare på de olika funktionerna och förtydliga eventuella oklarheter.
Introduktion till MagicMock
MagicMock är en mycket mångsidig implementation av Mock som stöder magiska metoder. Du kan använda den för att efterlikna beteendet hos komplexa objekt i dina tester, som vi såg i föregående kapitel.
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)
I detta exempel används MagicMock för att simulera metoden get_account_balance, som vanligtvis skulle hämta data från en databas.
Använda mock.patch
@mock.patch används för att tillfälligt ersätta de verkliga implementationerna av objekt i din kod.
Föreställ dig en funktion som kontrollerar användaruppgifter mot en databas. Du kan använda mock.patch för att undvika att anropa den faktiska databasen:
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)
Mockning med Context Manager
Ibland är det att föredra att använda patch() som en context manager istället för en dekoratör, särskilt när:
- du behöver mocka ett objekt endast under en del av testet;
- eller när överdriven användning av dekoratörer eller parametrar minskar tydligheten i dina tester.
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 0
class TestBankAccount(unittest.TestCase):
def test_balance_retrieval(self):
with patch.object(BankAccount, 'get_account_balance', return_value=1000) as mock_get:
account = BankAccount(1)
self.assertEqual(account.balance, 1000)
mock_get.assert_called_once_with(1)
Pytest Monkey Patch
monkeypatch-fixturen i Pytest låter dig tillfälligt modifiera klasser, moduler eller miljöer under ett 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'
monkeypatch-fixturen gör det möjligt att säkert modifiera och hantera miljön under testet utan att orsaka bieffekter utanför testets omfång.
1. Vilken av följande kodsnuttar mockar korrekt metoden get_balance så att den returnerar 500?
2. Vad testar följande test?
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
Awesome!
Completion rate improved to 3.13
Avancerad Mocking i Unittest
Svep för att visa menyn
I föregående kapitel såg vi vikten av att använda Mock vid testning. Nu ska vi titta närmare på de olika funktionerna och förtydliga eventuella oklarheter.
Introduktion till MagicMock
MagicMock är en mycket mångsidig implementation av Mock som stöder magiska metoder. Du kan använda den för att efterlikna beteendet hos komplexa objekt i dina tester, som vi såg i föregående kapitel.
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)
I detta exempel används MagicMock för att simulera metoden get_account_balance, som vanligtvis skulle hämta data från en databas.
Använda mock.patch
@mock.patch används för att tillfälligt ersätta de verkliga implementationerna av objekt i din kod.
Föreställ dig en funktion som kontrollerar användaruppgifter mot en databas. Du kan använda mock.patch för att undvika att anropa den faktiska databasen:
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)
Mockning med Context Manager
Ibland är det att föredra att använda patch() som en context manager istället för en dekoratör, särskilt när:
- du behöver mocka ett objekt endast under en del av testet;
- eller när överdriven användning av dekoratörer eller parametrar minskar tydligheten i dina tester.
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 0
class TestBankAccount(unittest.TestCase):
def test_balance_retrieval(self):
with patch.object(BankAccount, 'get_account_balance', return_value=1000) as mock_get:
account = BankAccount(1)
self.assertEqual(account.balance, 1000)
mock_get.assert_called_once_with(1)
Pytest Monkey Patch
monkeypatch-fixturen i Pytest låter dig tillfälligt modifiera klasser, moduler eller miljöer under ett 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'
monkeypatch-fixturen gör det möjligt att säkert modifiera och hantera miljön under testet utan att orsaka bieffekter utanför testets omfång.
1. Vilken av följande kodsnuttar mockar korrekt metoden get_balance så att den returnerar 500?
2. Vad testar följande test?
Tack för dina kommentarer!