Python 单元测试 Class 属性
Python unit testing Class properties
我想弄清楚是否有办法(单元测试)验证 属性 和 setter 是否实际被调用来设置名称属性。
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。谁有更好的主意?谢谢!
通过使用这样的模拟,您已经覆盖了您正在尝试测试的代码。模拟用于被测代码外部的调用。
对此代码的适当测试是断言如果您传递的不是字符串,则会引发异常。
def testNameProperty(self):
dummyName = DummyName()
with self.assertRaises(Exception):
dummyName.name = 12345
您的 class 需要继承自 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
您还需要为 class 中的 name
使用不同的变量,否则您将达到最大递归。
我想弄清楚是否有办法(单元测试)验证 属性 和 setter 是否实际被调用来设置名称属性。
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。谁有更好的主意?谢谢!
通过使用这样的模拟,您已经覆盖了您正在尝试测试的代码。模拟用于被测代码外部的调用。
对此代码的适当测试是断言如果您传递的不是字符串,则会引发异常。
def testNameProperty(self):
dummyName = DummyName()
with self.assertRaises(Exception):
dummyName.name = 12345
您的 class 需要继承自 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
您还需要为 class 中的 name
使用不同的变量,否则您将达到最大递归。