Pytest 如何模拟 requests库中的Response对象?

请问如何在 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函数是无法修改的。

阅读 4.8k
1 个回答

requests.models

很简单, 初始化一个实例, 设置 Response.content 属性就好了. text, json, file 等属性都是由 content 通过处理得到的, 也就是说 content 才是响应的正文部分.

看看源代码就啥都知道了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏