【问题标题】:python Mock post inside a method方法内的python模拟帖子
【发布时间】:2017-08-06 17:07:09
【问题描述】:

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

    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

有没有办法在不实际发布的情况下覆盖这种单元测试方法?

【问题讨论】:

标签: python unit-testing


【解决方案1】:

您可以使用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

【讨论】:

  • mock 适用于 2.6 或更高版本;直到 3.3 才成为标准库的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多