unittest.mock.patch
или библиотеки наподобие `pytest-mock` позволяют это сделать. Пример с `unittest.mock.patch`:
import unittest
from unittest.mock import patch
class MyClass:
def _private_method(self):
return "original"
def public_method(self):
return self._private_method()
class TestMyClass(unittest.TestCase):
@patch('__main__.MyClass._private_method')
def test_public_method_with_mocked_private(self, mock_private):
mock_private.return_value = "mocked"
instance = MyClass()
self.assertEqual(instance.public_method(), "mocked")
Тестирование приватных методов и свойств напрямую считается плохой практикой, поскольку нарушает принципы инкапсуляции и может привести к хрупким тестам. Приватные методы предназначены для внутреннего использования класса и не должны быть частью его публичного API.
Вместо непосредственного тестирования приватных методов и свойств, следует тестировать публичные методы, которые используют эти приватные методы. Это позволит убедиться, что приватная логика работает правильно в контексте использования в публичном API.
Тем не менее, существуют ситуации, когда тестирование приватных методов может быть оправдано (например, сложная логика, которую сложно протестировать через публичные методы). В таких случаях можно использовать следующие подходы, но с осторожностью:
class MyClass:
def __private_method(self):
return "Secret!"
# В тестовом файле
obj = MyClass()
result = obj._MyClass__private_method() # Доступ к приватному методу (не рекомендуется!)
import pytest
class MyClass:
def __private_method(self):
return "Original"
def public_method(self):
return self.__private_method() + " Public"
def test_public_method_with_mocked_private(mocker):
obj = MyClass()
mocked_private = mocker.patch.object(MyClass, '_MyClass__private_method', return_value="Mocked")
result = obj.public_method()
assert result == "Mocked Public"
mocked_private.assert_called_once()
В этом примере мы используем `mocker.patch.object`, чтобы заменить приватный метод `__private_method` на мок. Когда вызывается `public_method`, он вызывает мок, который возвращает "Mocked". Таким образом, мы можем проверить, как `public_method` ведет себя с другим возвращаемым значением от приватного метода. Также `mocked_private.assert_called_once()` проверяет, что мок действительно был вызван.
Важно: Всегда старайтесь избегать тестирования приватных методов напрямую. Используйте эти методы только в крайнем случае, когда другие подходы невозможны. Имейте в виду, что тестирование приватных методов делает ваши тесты более хрупкими и сложными в сопровождении.