请问如何在 Pytest 框架中模拟requests库中的Response对象?
涉及到的主体代码如下:
def get_address(phone):
url = 'http://www.ip138.com:8080/search.asp?action=mobile&mobile=%s' % (phone)
r = requests.get(url)
r.encoding = 'GBK'
soup = BeautifulSoup(r.text, 'html.parser')
try:
data = soup.find_all('td')[6].text.split('\xa0')
except IndexError:
data = False
print(data)
return data
测试代码如下:
correct_response = requests.get('http://www.ip138.com:8080/search.asp?action=mobile&mobile=13012345678')
wrong_response = requests.get('http://www.ip138.com:8080/search.asp?action=mobile&mobile=110')
def test_get_address(monkeypatch):
def test1(phone):
return correct_response
def test2(phone):
return wrong_response
monkeypatch.setattr('requests.get', test1)
assert cli.get_address('13012345678') == ['重庆', '']
monkeypatch.setattr('requests.get', test2)
assert cli.get_address('110') == False
我希望可以构造一个Response对象,并在test函数中直接返回,但是Response对象中的text函数是无法修改的。
requests.models
很简单, 初始化一个实例, 设置
Response.content
属性就好了.text
,json
,file
等属性都是由content
通过处理得到的, 也就是说content
才是响应的正文部分.看看源代码就啥都知道了