【问题标题】:Python unit testing Class propertiesPython单元测试类属性
【发布时间】:2017-08-14 18:10:41
【问题描述】:

我试图弄清楚是否有办法(单元测试)验证属性和 setter 是否被实际调用来设置 name 属性。

class DummyName:
    def __init__(self):
        self.name = ''

    @property
    def name(self):
        return self.name

    @name.setter
    def name(self, name):
        if not isinstance(name, basestring):
            raise Exception('Name must be a string.')
        self.name = name

尝试做这样的事情......

@mock.patch.object(DummyName, 'name', new_callable=PropertyMock)
def testNameProperty(self, mock_name):
    MockName = Mock()
    mock_name.return_value = MockName
    dummyName = DummyName()
    dummyName.name = 'test_name'
    # assert setter is called to set the name
    # assert name is called to get the name
    # assert name is 'test_name'

似乎从未访问过 name() 和 setter。有人有更好的主意吗?谢谢!

【问题讨论】:

  • dummyName.name = 'test_name' 覆盖设置器字段。为不同的方法/变量/等使用不同的名称

标签: python python-unittest python-unittest.mock


【解决方案1】:

通过使用这样的模拟,您已经覆盖了您尝试测试的代码。模拟用于被测代码外部的调用。

此代码的适当测试是断言如果您传递的不是字符串,则会引发异常。

def testNameProperty(self):
    dummyName = DummyName()
    with self.assertRaises(Exception):
        dummyName.name = 12345

【讨论】:

  • 这给出了AssertionError: Exception not raised 错误
  • 查看 Cory 的回答了解原因。
【解决方案2】:

你的类需要继承自object

class DummyName(object):
    def __init__(self):
        self._name = ''

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, name):
        if not isinstance(name, basestring):
            raise Exception('Name must be a string.')
        self._name = name

您还需要为类中的name 使用不同的变量,否则您将达到最大递归。

【讨论】:

    猜你喜欢
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多