【发布时间】:2022-01-23 09:01:47
【问题描述】:
我有一个 Node 类,我想确保只接受其他 Node 对象作为其子对象,但在我的单元测试中从未提出 TypeError 。我正在使用 python 3。
类
class Node:
def __init__(self, data):
self._child = None
self._data = data
@property
def child(self):
return self._child
@child.setter
def child(self, child):
if not isinstance(child, Node):
raise TypeError(f"Children must be of type Node, not {type(child)}.")
self._child = child
@property
def data(self):
return self._data
@data.setter
def data(self, data):
self._data = data
测试
def test_node_child_error():
node = Node(1)
with pytest.raises(TypeError):
node.child = 2
单元测试返回Failed: DID NOT RAISE <class 'TypeError'>,当我尝试将新值记录到设置器内部的终端时,它说child 是<class 'NoneType'>,但值确实会根据Node 对象本身而改变当我之后记录它时。
我一直在尝试使用 PyCharm 调试器仔细查看,但不幸的是,我在另一个文件中使用了与调试器中使用的类相同的类名,因此它不再工作了。
【问题讨论】:
-
测试在我的机器上进行。我在您的代码中发现了两件事,您可以尝试修复它们并重试。在
child设置器中有一个名为right的变量未定义,self.和_child之间有一个空格(无论如何测试都对我有效)。你是如何运行测试的?我通过执行:pytest -
right显然应该是child。 -
那些只是复制我的代码的拼写错误。感谢您指出这一点,它们在我的代码中是正确的,并且测试仍然无法正常工作。
-
无法复制。你确定你在
__init__中有self._child = None,而不是self.child = None? -
(可以说,
self._child = None是错误的。setter 的重点是确保self._child不会收到无效值,并且您通过不使用 @ 中的 setter 来规避这一点987654342@.)
标签: python python-3.x unit-testing typeerror setter