Python:函数的单元测试,不返回任何内容,而是更改对象的状态

Python:函数的单元测试,不返回任何内容,而是更改对象的状态,python,testing,Python,Testing,我有一个函数,它不返回任何值,但更改其对象的内部状态。例如: class A(object): def __init__(self): self._status = None def doSomethingThatResultsInChangingStatus(self): ...do some computing... self._status = newStatus \u status实例变量是私有的,因此尽管Python技

我有一个函数,它不返回任何值,但更改其对象的内部状态。例如:

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

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

\u status
实例变量是私有的,因此尽管Python技术上允许我在函数调用后检查其状态,但我觉得我不应该这样做。我现在检查它的方法是为
\u status
变量提供一个getter函数,但这与直接检查私有变量基本相同。测试这种函数的正确方法是什么?

DoSomethingThatResultingsChangingStatus'是否返回任何值?如果它不返回任何内容,则可以使用其返回值指示状态是否已更改


或者,您可以为此更改
self.status\u
成员。更改后,将该值设置为True,并在适用时重置为False

DoSomethingthatResultingsChangingStatus'是否返回任何值?如果它不返回任何内容,则可以使用其返回值指示状态是否已更改


或者,您可以为此更改
self.status\u
成员。更改后,将值设置为True,并在适用的情况下重置为False

只需继续并直接评估
\u状态

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

这就是我们使用Python的原因之一,对吗?不必在私人空间里设计出像只测试用包装纸这样的愚蠢装置。回想起Python中的Private仅用于标记不适用于一般客户端使用的成员,如果您不知道自己在做什么,则可能无法安全使用这些成员。

直接评估
\u状态即可:

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


这就是我们使用Python的原因之一,对吗?不必在私人空间里设计出像只测试用包装纸这样的愚蠢装置。回想起Python中的Private仅用于标记不适合一般客户端使用的成员,如果您不知道自己在做什么,则可能无法安全使用这些成员。

不要羞于访问
\u status
。提供一个getter是愚蠢的。尽管您可能会考虑如何仅使用外部可见的API来测试这一点。更改对象的状态是有原因的。因为它,以后一定会发生一些不同的事情。测试一下。谢谢你的输入!我觉得我在作弊,因为Python允许我访问私有变量。你是说如果我用一种不允许我访问私有数据的语言写这篇文章,我应该仅仅为了测试而为私有成员创建一个getter?出于某种原因,我觉得这很奇怪,但可能我不必要地过于纯粹。此外,我可以通过验证其他方法的输出来检查它,这些方法的返回值取决于_status变量值(这是您基本上建议的)。但是我在一个测试中涉及了两种不同的方法,如果后一种方法中有bug,即使失败,测试也可能通过。我不会提供任何关于用其他语言做什么的建议。在Python中,为该属性编写getter是愚蠢的。如果您想查看状态是否更改,只需检查您拥有的属性。不要羞于访问
\u status
。提供一个getter是愚蠢的。尽管您可能会考虑如何仅使用外部可见的API来测试这一点。更改对象的状态是有原因的。因为它,以后一定会发生一些不同的事情。测试一下。谢谢你的输入!我觉得我在作弊,因为Python允许我访问私有变量。你是说如果我用一种不允许我访问私有数据的语言写这篇文章,我应该仅仅为了测试而为私有成员创建一个getter?出于某种原因,我觉得这很奇怪,但可能我不必要地过于纯粹。此外,我可以通过验证其他方法的输出来检查它,这些方法的返回值取决于_status变量值(这是您基本上建议的)。但是我在一个测试中涉及了两种不同的方法,如果后一种方法中有bug,即使失败,测试也可能通过。我不会提供任何关于用其他语言做什么的建议。在Python中,为该属性编写getter是愚蠢的。如果要查看状态是否更改,只需检查您拥有的属性。DoSomethingthatResultingsChangingStatus不会返回任何内容,因此这不适用。如果它确实返回了一些东西,就不会问这个问题;)。为了这个目的添加额外的成员self.status_changed可能是实现测试最不优雅的方式。我的意思是为什么不在“doSomethingthatsresultingstatus”中添加一个返回值呢?如果函数所做的唯一事情是更改状态,那么添加bool返回值以指示它是否更改了某些内容可能是有意义的。是否应直接读取“\u status”取决于类的设计。如果状态应该是由外部访问,只需将其重命名为“状态”,这样更为优雅。如果您不希望外部访问“status”的确切值,而只允许外部知道该值是否已更改,那么我不明白为什么“status_changed”不优雅。在我看来,“\u status”唯一更好的情况是,只有单元测试从外部访问成员,而不是任何其他代码。如果您正在单元测试其他人的代码,不能修改代码,那么“\u status”可能是DoSomethingthatResultingStatus不返回任何内容的唯一方式,所以这是不适用的。如果它确实返回了一些东西,就不会问这个问题;)。为了这个目的添加额外的成员self.status_changed可能是实现测试最不优雅的方式。我的意思是为什么不在“doSomethingthatsresultingstatus”中添加一个返回值呢?如果函数所做的唯一一件事就是改变状态,那么添加一个bool返回值来指示它是否改变了某些东西可能是有意义的