python模拟帖子里面的方法

时间:2017-08-06 17:07:10

标签: python unit-testing

如何模拟方法中的帖子,以便我可以进行单元测试?

    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

有没有办法在没有实际发布的情况下覆盖此方法进行单元测试?

1 个答案:

答案 0 :(得分:0)

您可以使用mock库将requests.post替换为其他内容:

with mock.patch('requests.post') as mock_post:
    foo.send_report(data)

mockthird-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