1

我正在尝试使用我编写的自定义模拟来修补函数调用

    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

但是,当我运行它时,它会返回一个属性错误

“NoneType”对象没有属性“注销”

我猜return_value设置为 NoneType 但我认为这subscriberMock.return_value.unregister.return_value会覆盖它


更多信息:

如果我打印self.subscribers[topic]它返回None。然后它运行副作用。为什么应该self.subscribers[topic] = None假设我有一个参数的返回值。

4

1 回答 1

1

而不是上面的模拟,你必须编写一个模拟调用副作用内的实例化

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

于 2017-06-07T21:09:43.540 回答