Python属性和unittest TestCase

时间:2015-03-31 08:37:45

标签: python unit-testing

今天我写了一个测试并在一种测试方法中输入了错误。我的测试失败但我不明白为什么。它是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 中使用实例创建修复拼写错误,则所有测试都按预期工作。但是这个例子让我回过头来问:使用属性是否安全?如果有一天我会再次拼错怎么办?

2 个答案:

答案 0 :(得分:1)

您可以使用patch中的PropertyMockmock来完成此类工作:

@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库。