Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python“;回应;模拟-无法多次调用一个URL_Python_Unit Testing_Python Requests_Mocking - Fatal编程技术网

Python“;回应;模拟-无法多次调用一个URL

Python“;回应;模拟-无法多次调用一个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

我在测试中使用python
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