模拟跨库调用链

1 投票
1 回答
1254 浏览
提问于 2025-04-17 22:10

我正在使用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

撰写回答