Как имитировать свойство, доступное только для чтения, в Python с помощью библиотеки Mock

Чтобы имитировать свойство, доступное только для чтения, в Python с помощью библиотеки mock, вы можете использовать разные методы. Вот несколько методов с примерами кода:

Метод 1: исправление свойства с помощью объекта MagicMock

from unittest import TestCase
from unittest.mock import patch
class MyClass:
    @property
    def read_only_property(self):
        return 42
class MyTestClass(TestCase):
    def test_mock_read_only_property(self):
        with patch('__main__.MyClass.read_only_property', new_callable=PropertyMock) as mock_property:
            mock_property.return_value = 84
            instance = MyClass()
            result = instance.read_only_property
            self.assertEqual(result, 84)

Метод 2: создание фиктивного объекта и установка значения свойства

from unittest import TestCase
from unittest.mock import MagicMock
class MyClass:
    @property
    def read_only_property(self):
        return 42
class MyTestClass(TestCase):
    def test_mock_read_only_property(self):
        instance = MyClass()
        instance.read_only_property = MagicMock(return_value=84)
        result = instance.read_only_property()
        self.assertEqual(result, 84)

Метод 3: создание подкласса исходного класса и переопределение свойства

from unittest import TestCase
from unittest.mock import patch
class MyClass:
    @property
    def read_only_property(self):
        return 42
class MyTestClass(TestCase):
    def test_mock_read_only_property(self):
        class MockClass(MyClass):
            @property
            def read_only_property(self):
                return 84
        instance = MockClass()
        result = instance.read_only_property
        self.assertEqual(result, 84)