如何模拟方法中的帖子,以便我可以进行单元测试?
def send_report(self, data):
url = settings.WEBHOOK_PO
payload = json.dumps(data)
requests.post(url, data=payload)
url = settings.WEBHOOK_LQA
response = requests.post(url, data=payload)
return response.status_code
有没有办法在没有实际发布的情况下覆盖此方法进行单元测试?
答案 0 :(得分:0)
您可以使用mock
库将requests.post
替换为其他内容:
with mock.patch('requests.post') as mock_post:
foo.send_report(data)
(mock
是third-party package,但在Python 3.3中作为unittest
包的一部分添加到标准库中。)
mock_post
可以配置为在测试期间提供所需的行为;有关详细信息,请参阅mock
文档。
另一种选择是修改你的方法以将post
函数作为参数,而不是对函数进行硬编码(这是依赖注入的一个例子):
def send_report(self, data, poster=requests.post):
url = settings.WEBHOOK_PO
payload = json.dumps(data)
poster(url, data=payload)
url = settings.WEBHOOK_LQA
response = poster(url, data=payload)
return response.status_code
如果要测试函数,只需传递一个不同的可调用对象作为可选的第二个参数。
请注意,您可以为这两种类型的帖子提供单独的功能,这可能比使用模拟更容易测试:
from functools import partial
def send_report(self,
data,
post_po=partial(requests.post, settings.WEBHOOK_PO),
post_lqa=partial(requests.post, settings.WEBHOOK_LQA)):
payload = json.dumps(data)
post_po(data=payload)
response = post_lqa(data=payload)
return response.status_code