重新访问测试python描述符

时间:2014-05-25 17:53:04

标签: python testing descriptor

我刚刚了解了python的描述符,我认为它们可能只是解决我遇到的问题的方法。我想为我写的描述符类编写测试,我发现another post有一些示例代码,但我真的不明白它。

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以确保它适当地抛出异常。

1 个答案:

答案 0 :(得分:0)

我不认为描述符适用于此处,我认为您应该考虑使用模拟框架来代替此类测试。对于Python,有Mox库。要了解如何使用Mox模拟属性,请参阅this question

此技术称为依赖注入(有关详细信息,请参阅WikipediaSOMartin Fowler

  

我编写了一个PhysicalProperty描述符类,它应该在实例化时采用下限,如果用户尝试将值设置为小于下限,则引发异常。我想测试PhysicalProperty以确保它适当地抛出异常。

您可以验证通过子类化unittest.TestCase提供的assertRaises()assertRaisesRegexp()方法抛出异常,就像您在代码中已经做过的那样。