模拟跨库调用链
我正在使用hammock这个库来简化对内部API的请求。在我的代码中,self.api
是一个Hammock对象,我这样调用:
posts = self.api.posts().GET(params=params).json().get('objects')
这里,.GET会返回一个响应对象,.json会把这个响应转换成一个字典,而.get则是从这个字典中获取'objects'这个键对应的值。
我想要的是让这个整个调用直接返回我已经设置好的一个数据(fixture)。但是,当我尝试像这样写self.worker.api.posts.get = Mock(return_value=fixture)
时,它却不奏效,依然会去调用实际的API。
这可能吗?还是说我应该放弃尝试模拟这么具体的调用,而是只模拟包含这个调用的方法呢?
1 个回答
2
你需要为所有的 return_values
设置模拟值。当你调用 self.api.posts()
时,会返回一个模拟对象,你想获取这个模拟对象并设置它的返回值,这个返回值是一个有 GET()
方法的对象,而你也想模拟这个 GET()
方法的返回值,直到你最后一次想要模拟的调用。
下面是一个例子:
self.api.posts.return_value.GET.return_value.json.return_value.get = Mock(return_value=fixture)
这是我工作的例子:
json_obj = mock.MagicMock(return_value=self.hardcoced_labels)
con.return_value.repos.return_value.labels.GET.return_value.json = json_obj