今天我写了一个测试并在一种测试方法中输入了错误。我的测试失败但我不明白为什么。它是Python属性的特殊行为还是别的什么?
from unittest import TestCase
class FailObject(object):
def __init__(self):
super(FailObject, self).__init__()
self.__action = None
@property
def action(self):
return self.__action
@action.setter
def action(self, value):
self.__action = value
def do_some_work(fcells, fvalues, action, value):
currentFailObject = FailObject()
rects = [currentFailObject]
return rects
class TestModiAction(TestCase):
def testSetFailObjectAction(self):
rect = FailObject # IMPORTANT PART
rect.action = "SOME_ACTION" # No fail!
self.assertEquals("SOME_ACTION", rect.action)
def testSimple(self):
fcells = []
fvalues = []
rects = do_some_work(fcells, fvalues, 'act', 0.56)
rect = rects[0]
self.assertEquals('act', rect.action)
当我用鼻子测试运行这个测试用例时:
.F
======================================================================
FAIL: testSimple (test.ufsim.office.core.ui.cubeeditor.TestProperty.TestModiAction)
----------------------------------------------------------------------
Traceback (most recent call last):
File "TestProperty.py", line 36, in testSimple
self.assertEquals('act', rect.action)
AssertionError: 'act' != 'SOME_ACTION'
----------------------------------------------------------------------
Ran 2 tests in 0.022s
FAILED (failures=1)
如果我在 testSetFailObjectAction 中使用实例创建修复拼写错误,则所有测试都按预期工作。但是这个例子让我回过头来问:使用属性是否安全?如果有一天我会再次拼错怎么办?
答案 0 :(得分:1)
您可以使用patch
中的PropertyMock
和mock
来完成此类工作:
@patch(__name__."FailObject.action", new_callable=PropertyMock, return_value="SOME_ACTION")
def testSetFailObjectAction(self, mock_action):
self.assertEquals("SOME_ACTION", FailObject().action)
self.assertTrue(mock_action.called)
#This fail
self.assertEquals("SOME_ACTION", FailObject.action)
通过patch
,您只需为测试上下文替换属性action
,您还可以检查该属性是否已被使用。
答案 1 :(得分:0)
好的,这是Python的默认行为。在 testSetFailObjectAction 中,我们添加隐藏属性的新静态类变量。没有办法保护自己免受这样的错误。
唯一的建议是使用Traits库。