1. mocker.patch
mocker.patch
是最常用的方法,用于替換指定的對象或方法。它可以用于模擬函數、方法、類或模塊。
語法
mocker.patch(target, new=DEFAULT, spec=None, create=False, spec_set=None, autospec=None, new_callable=None, **kwargs)
示例
import pytest
from my_module import greet_userdef test_greet_user(mocker):# 模擬 my_module.get_greeting 函數mock_get_greeting = mocker.patch('my_module.get_greeting', return_value="Hi, John Doe!")result = greet_user("John Doe")assert result == "Hi, John Doe!"mock_get_greeting.assert_called_once_with("John Doe")
2. mocker.patch.object
mocker.patch.object
用于替換對象上的特定方法或屬性。
語法
mocker.patch.object(target, attribute, new=DEFAULT, spec=None, create=False, spec_set=None, autospec=None, new_callable=None, **kwargs)
示例
import pytest
from my_module import User, greet_userdef test_greet_user(mocker):# 模擬 User 類的 get_name 方法mock_get_name = mocker.patch.object(User, 'get_name', return_value="John Doe")user = User()result = greet_user(user)assert result == "Hi, John Doe!"mock_get_name.assert_called_once()
3. mocker.patch.dict
mocker.patch.dict
用于臨時修改字典,通常用于修改環境變量或配置字典。
語法
mocker.patch.dict(in_dict, values=(), clear=False, **kwargs)
示例
import pytest
import osdef test_environment_variable(mocker):# 模擬環境變量mocker.patch.dict('os.environ', {'MY_VAR': 'value'})assert os.environ['MY_VAR'] == 'value'
4. mocker.spy
mocker.spy
用于創建一個 spy,它會記錄方法的調用,但不會改變方法的行為。
語法
mocker.spy(target, method)
示例
import pytest
from my_module import Userdef test_user_get_name(mocker):user = User(name="John Doe")# 創建一個 spyspy_get_name = mocker.spy(user, 'get_name')result = user.get_name()assert result == "John Doe"spy_get_name.assert_called_once()
5. mocker.stub
mocker.stub
用于創建一個沒有預定義行為的模擬對象,通常用于測試回調函數。
語法
mocker.stub()
示例
import pytestdef test_callback(mocker):callback = mocker.stub()# 調用回調函數callback("Hello, World!")callback.assert_called_once_with("Hello, World!")
6. mocker.MagicMock
mocker.MagicMock
是一個更強大的模擬對象,可以模擬任何對象,并提供豐富的斷言方法。
語法
mocker.MagicMock(*args, **kwargs)
示例
import pytestdef test_magic_mock(mocker):mock_obj = mocker.MagicMock()mock_obj.method.return_value = "Hello, World!"result = mock_obj.method()assert result == "Hello, World!"mock_obj.method.assert_called_once()
7. mocker.AsyncMock
mocker.AsyncMock
用于模擬異步函數或方法。
語法
mocker.AsyncMock(*args, **kwargs)
示例
import pytest
import asyncioasync def async_function():return "Hello, World!"def test_async_function(mocker):mock_async_function = mocker.AsyncMock(return_value="Hello, World!")result = asyncio.run(mock_async_function())assert result == "Hello, World!"mock_async_function.assert_called_once()