Еще раз о тестировании дескрипторов Python

Я только что узнал о дескрипторах 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, чтобы убедиться, что исключение генерируется соответствующим образом.


person joshua.r.smith    schedule 25.05.2014    source источник


Ответы (1)


Я не думаю, что здесь применимы дескрипторы, и я думаю, что вам следует подумать об использовании mocking фреймворка вместо этого для этого типа тестирования. Для Python есть библиотека Mox. Чтобы узнать, как имитировать свойства с помощью Mox, см. этот вопрос.

Этот метод известен как внедрение зависимостей (см. Википедию, SO и Мартин Фаулер для получения дополнительной информации).

Я написал класс дескриптора PhysicalProperty, который должен принимать нижнюю границу при создании экземпляра и вызывать исключение, если пользователь пытается установить значение меньше нижней границы. Я хочу протестировать PhysicalProperty, чтобы убедиться, что он правильно выбрасывает исключение.

Вы можете проверить возникновение исключения с помощью assertRaises() или методы assertRaisesRegexp() путем создания подкласса unittest.TestCase, как вы уже делаем в вашем коде.

person Misha Brukman    schedule 25.05.2014