Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Avancerad Mocking i Unittest | Behärska Unittest-Ramverket
Python Strukturell Programmering

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

question mark

Vilken av följande kodsnuttar mockar korrekt metoden get_balance så att den returnerar 500?

Select the correct answer

question mark

Vad testar följande test?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 5. Kapitel 5

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

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

question mark

Vilken av följande kodsnuttar mockar korrekt metoden get_balance så att den returnerar 500?

Select the correct answer

question mark

Vad testar följande test?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 5. Kapitel 5
some-alt