Python:对不返回任何值但改变对象状态的函数进行单元测试

2 投票
3 回答
4287 浏览
提问于 2025-04-18 13:10

我有一个函数,它不返回任何值,但会改变它所属于对象的内部状态。例如:

class A(object):
    def __init__(self):
        self._status = None

    def doSomethingThatResultsInChangingStatus(self):
        ...do some computing...
        self._status = newStatus

这个 _status 实例变量是设计成私有的,所以尽管Python技术上允许我在函数调用后检查它的状态,但我觉得这样做不太合适。我现在检查它的方式是通过为 _status 变量创建一个获取函数,但这本质上和直接检查私有变量是类似的。那么,测试这种函数的正确方法是什么呢?

3 个回答

1

一种方法是通过某个获取函数来访问私有变量。

class A:
    def getStatus(self):
         return self._status

然后在断言语句中使用这个函数:

def test():
   a.changeStatus()
   assert a.getStatus() == 'newStatus'

[更新]

或者像@chepner建议的那样,使用属性:

class A:
    def __init__(self)
        self._status

    @property
    def status(self):
        return self._status

    @status.setter
    def status(self, value):
        self._status = value

你可以通过 a.status 来访问状态。

更多信息请查看:https://docs.python.org/3/library/functions.html#property

1

‘doSomethingThatResultsInChangingStatus’这个函数有没有返回值?如果它什么都不返回,你可以用它的返回值来表示状态是否发生了变化。

或者,你可以用一个叫self.status_changed的成员变量来实现这个目的。一旦状态改变,就把这个值设为True,在合适的时候再把它重置为False。

5

直接去检查一下 _status 就行了:

def test():
    a = A()
    a.doSomethingThatResultsInChangingStatus()
    assert a._status == 'changed correctly'

这正是我们使用Python的原因之一,对吧?就是为了不需要搞一些奇怪的东西,比如 只用于测试的私有包装器。记住,我们都是成年人了。在Python中,私有的意思只是为了标记那些不打算让普通用户使用的成员,如果你不知道自己在做什么,使用这些可能不安全。

撰写回答