Python:对不返回任何值但改变对象状态的函数进行单元测试
我有一个函数,它不返回任何值,但会改变它所属于对象的内部状态。例如:
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中,私有的意思只是为了标记那些不打算让普通用户使用的成员,如果你不知道自己在做什么,使用这些可能不安全。