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 个值,要么有副作用