Python“;回应;模拟-无法多次调用一个URL
我在测试中使用pythonPython“;回应;模拟-无法多次调用一个URL,python,unit-testing,python-requests,mocking,Python,Unit Testing,Python Requests,Mocking,我在测试中使用pythonresponses模块模拟API响应。问题是,在注册url后,responses.add()只能使用requests.get()调用一次,对同一url的后续调用会引发异常 assert responses.assert_call_count(URL, 1) is True 导入请求 输入响应 URL='1〕http://localhost/abcd' #试验方法 @响应。激活 def get_url(url): 返回请求。获取(url) #设置URL模拟 respon
responses
模块模拟API响应。问题是,在注册url后,responses.add()
只能使用requests.get()
调用一次,对同一url的后续调用会引发异常
assert responses.assert_call_count(URL, 1) is True
导入请求
输入响应
URL='1〕http://localhost/abcd'
#试验方法
@响应。激活
def get_url(url):
返回请求。获取(url)
#设置URL模拟
responses.add(responses.GET,URL,body=“A B C D”)
现在,第一个调用开始工作:
打印(获取url)
但是,相同的呼叫再次失败:
打印(获取url)
回溯(最近一次呼叫最后一次):
文件“test responses.py”,第19行,在
打印(获取url)
包装器中第3行的文件“”
文件“testresponses.py”,第10行,在get_url中
返回请求。获取(url)
get中第75行的文件“../site packages/requests/api.py”
返回请求('get',url,params=params,**kwargs)
文件“../site packages/requests/api.py”,第60行,请求中
return session.request(method=method,url=url,**kwargs)
文件“../site packages/requests/sessions.py”,第533行,请求中
resp=自我发送(准备,**发送)
文件“../site packages/requests/sessions.py”,第646行,在send中
r=适配器.send(请求,**kwargs)
文件“../site packages/responses.py”,第674行,在发送时未绑定
根据请求返回self.\u(适配器、请求、*a、**kwargs)
文件“../site packages/responses.py”,第654行,根据请求输入
提出回应
requests.exceptions.ConnectionError:响应拒绝连接-调用与任何已注册的模拟不匹配。
请求:
-得到http://localhost/abcd
可用匹配项:
>>>
有没有办法使模拟URL永久化,并根据测试需要多次调用它们?简短回答:没有,我不这么认为。 我正在查看
响应的源代码,它所做的一件事是为每个未调用的请求引发一个错误,因此您所描述的内容与这种设置不一致
如果我面临这个问题,我会制作自己的get
函数,预先模拟响应,如下所示:
def mocked_get(url, body="A B C D", params=None, **kwargs): # I stole the arguments from requests.get
responses.add(responses.GET, url, body=body)
return requests.get(url, params=params, **kwargs)
我会用这个代替请求。得到简短的回答:不,我不这么认为。
我正在查看响应的源代码,它所做的一件事是为每个未调用的请求引发一个错误,因此您所描述的内容与这种设置不一致
如果我面临这个问题,我会制作自己的get
函数,预先模拟响应,如下所示:
def mocked_get(url, body="A B C D", params=None, **kwargs): # I stole the arguments from requests.get
responses.add(responses.GET, url, body=body)
return requests.get(url, params=params, **kwargs)
我会用它来代替请求。get
原始代码的问题是get\u url
用decorator包装,每次调用get\u url
时,它都会创建一个新的响应上下文,但是,response.add
register url mock只注册一次-对于第一个响应上下文
@response.激活用于测试用例的装饰程序。
下面是使用decorator的正确方法,它允许向同一url发出请求
@responses.activate
def test_function():
responses.add(responses.GET, URL, body="A B C D")
print(get_url(URL))
print(get_url(URL))
test_function()
使用responses.start()/responses.stop()
允许对同一URL发出多个请求
import requests
import responses
URL = 'http://localhost/abcd'
def get_url(url):
return requests.get(url)
# Test method
responses.start()
# Set up URL mock
responses.add(responses.GET, URL, body="A B C D")
print(get_url(URL))
print(get_url(URL))
responses.stop()
对于单元测试,我使用混合代码
顺便说一句,最新的responses
version(0.12.0)有一个功能,可以毫无例外地检查对url的请求数量
assert responses.assert_call_count(URL, 1) is True
原始代码的问题是get\u url
用decorator包装,每次调用get\u url
时,它都会创建一个新的响应上下文,但是response.add
register url mock只注册一次-对于第一个响应上下文
@response.激活用于测试用例的装饰程序。
下面是使用decorator的正确方法,它允许向同一url发出请求
@responses.activate
def test_function():
responses.add(responses.GET, URL, body="A B C D")
print(get_url(URL))
print(get_url(URL))
test_function()
使用responses.start()/responses.stop()
允许对同一URL发出多个请求
import requests
import responses
URL = 'http://localhost/abcd'
def get_url(url):
return requests.get(url)
# Test method
responses.start()
# Set up URL mock
responses.add(responses.GET, URL, body="A B C D")
print(get_url(URL))
print(get_url(URL))
responses.stop()
对于单元测试,我使用混合代码
顺便说一句,最新的responses
version(0.12.0)有一个功能,可以毫无例外地检查对url的请求数量
assert responses.assert_call_count(URL, 1) is True