Я только что узнал о дескрипторах Python и думаю, что они могут помочь решить мою проблему. Я хотел бы написать тесты для класса дескриптора, который я написал, и я нашел другой пост с некоторым примером кода, но я этого не очень понимаю.
import unittest
class MockClass(object):
# add any methods to assert access here
class DescriptorTests(unittest.TestCase):
def _make_one(self, *args, **kw):
from original_module import DescriptorClass
return DescriptorClass(*args, **kw)
def test_class_access(self):
# only a type is passed in, no instance
desc = self._make_one()
res = desc.__get__(None, MockClass)
self.assertEqual(res.someattribute, 'somevalue')
# etc.
if __name__ == '__main__':
unittest.main()
Два вопроса. Во-первых, какова цель MockClass
? Я просто написал
class MockClass(object):
pass
и тесты вроде работают. Нужна ли MockClass
какая-либо функциональность?
Во-вторых, какова цель метода DescriptorTests._make_one
? Почему бы не импортировать DescriptorClass
сразу после unittest
, а затем создать экземпляр дескриптора в DescriptorTests.test_class_access
вот так:
import unittest
from original_module import DescriptorClass
class DescriptorTests(unittest.TestCase):
def test_class_access(self):
desc = DescriptorClass()
# other code
Заранее спасибо.
Фон, FWIW
Я пишу программу, моделирующую физическое явление, и поэтому пишу классы, требующие нескольких атрибутов общедоступных данных, которые ведут себя как физические свойства. Например, моему классу нужен атрибут temperature
, который хранит температуру объекта в градусах Кельвина. Отрицательные значения температуры в Кельвинах не имеют смысла. Другие физические свойства имеют аналогичные ограничения (отрицательные значения массы не имеют смысла и т. Д.). Вместо того, чтобы писать кучу по существу одинаковых @property
, я абстрагировал эту функциональность в класс дескриптора.
Я написал класс дескриптора PhysicalProperty
, который должен принимать нижнюю границу при создании экземпляра и вызывать исключение, если пользователь пытается установить значение меньше нижней границы. Я хочу протестировать PhysicalProperty
, чтобы убедиться, что исключение генерируется соответствующим образом.