gpt4 book ai didi

python - 单元测试中如何使用python Mock side_effect充当Class方法

转载 作者:太空狗 更新时间:2023-10-30 00:07:27 25 4
gpt4 key购买 nike

我正在用 python 测试一个自定义 API,它发出 http 请求,但我不想每次运行单元测试时都向真实的外部系统发出请求。我正在使用带有 side_effect 函数的 python 模拟库来动态伪造 API 响应。如何让 side_effect 方法表现得像类方法?

import requests

class MyApiClass():
def make_request(self, params):
return requests.get('http://someurl.com', params=params)

def create_an_object(self, params):
return self.make_request(params)

import unittest, mock

def side_effect_func(self, params):
if params['name'] == 'Specific Name':
return {'text': 'Specific Action'}
else:
return {'text': 'General Action'}

class MyApiTest(unittest.TestCase):
def setUp(self):
super(MyApiTest, self).setUp()
mocked_method = mock.Mock(side_effect=side_effect_func)
MyApiClass.make_request = mocked_method

def test_create_object(self):
api = MyApiClass()
params = {'name': 'Specific Name'}
r = api.create_an_object(params) # Complains that two arguments are needed!
self.assertEqual(r['text'], 'Specific Action')

我收到这个错误

TypeError: side_effect_func() takes exactly 2 arguments (1 given)

但我希望 side_effect_funcapi 作为第一个参数传递。感谢任何帮助!

最佳答案

最简单的方法可能是让您的模拟方法采用单个参数,然后在模拟方法本身内静态引用 MyApiClass。否则,您可以尝试模拟类对象本身(基本上是制作一个模拟元类),或者使用一个利用 partial 的工厂来动态构建一个模拟类方法。但是,如果单个参数/静态引用方法适合您,那对我来说似乎是最好的。

另外,从 Mock 文档中,有 mocking an unbound method using patch ,看起来它可能更符合您的需要。

关于python - 单元测试中如何使用python Mock side_effect充当Class方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19684461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com