Python magicmock 导致 'NoneType' 对象没有属性 'unregister'
Python magicmock causes 'NoneType' object has no attribute 'unregister'
我正在尝试使用我编写的自定义模拟来修补函数调用
subscriberMock = MagicMock(side_effect=subscriber)
subscriberMock.return_value.unregister.return_value = True
with patch('rospy.Subscriber', subscriberMock):
data['op'] = "unsubscribe"
data['topic'] = "/helo"
self.rosbridge.incoming(data)
内部方法有这段代码
self.subscribers[topic] = rospy.Subscriber(topic, 'msg', outgoing_function)
self.subscribers[topic].unregister() # <-- AttributeError
然而,当我运行这样做时,它return是一个属性错误
'NoneType' object has no attribute 'unregister'
我猜 return_value
设置为 NoneType 但我认为 subscriberMock.return_value.unregister.return_value
会覆盖它
更多信息:
如果我打印 self.subscribers[topic]
它 returns None
。然后 运行 是副作用。为什么要 self.subscribers[topic] = None
鉴于我在其中有一个参数的 return 值。
你必须编写一个 Mock 在副作用中调用实例化,而不是上面的模拟
def subscriber (topic, topic_type, outgoing_function):
# convert to a ROS object
output = ROSBridgeObject()
output.foo = topic
# pretend we got a message from what we subscribed to
outgoing_function(output)
mock = MagicMock()
subscriberMock.unregister.return_value = True
return mock
subscriberMock = MagicMock(side_effect=subscriber)
这是因为 MagicMock 要么有 return 个值,要么有副作用
我正在尝试使用我编写的自定义模拟来修补函数调用
subscriberMock = MagicMock(side_effect=subscriber)
subscriberMock.return_value.unregister.return_value = True
with patch('rospy.Subscriber', subscriberMock):
data['op'] = "unsubscribe"
data['topic'] = "/helo"
self.rosbridge.incoming(data)
内部方法有这段代码
self.subscribers[topic] = rospy.Subscriber(topic, 'msg', outgoing_function)
self.subscribers[topic].unregister() # <-- AttributeError
然而,当我运行这样做时,它return是一个属性错误
'NoneType' object has no attribute 'unregister'
我猜 return_value
设置为 NoneType 但我认为 subscriberMock.return_value.unregister.return_value
会覆盖它
更多信息:
如果我打印 self.subscribers[topic]
它 returns None
。然后 运行 是副作用。为什么要 self.subscribers[topic] = None
鉴于我在其中有一个参数的 return 值。
你必须编写一个 Mock 在副作用中调用实例化,而不是上面的模拟
def subscriber (topic, topic_type, outgoing_function):
# convert to a ROS object
output = ROSBridgeObject()
output.foo = topic
# pretend we got a message from what we subscribed to
outgoing_function(output)
mock = MagicMock()
subscriberMock.unregister.return_value = True
return mock
subscriberMock = MagicMock(side_effect=subscriber)
这是因为 MagicMock 要么有 return 个值,要么有副作用