2017-08-06 33 views
-1

我怎样才能嘲笑方法内的职位,所以我可以有单位测试?蟒蛇模拟帖子里面的方法

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

一个选项:https://github.com/getsentry/responses – jonrsharpe

回答

0

您可以使用mock库别的东西来代替requests.post

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

mockthird-party package,但被添加到标准库,为unittest package`的一部分,在Python 3.3。 )

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 
+0

我使用python 2.7 = /所以它不会工作 – alositas

+1

'mock'在2.6或更高版本下工作;直到3.3才成为标准库的一部分。 – chepner