首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何模拟请求和响应?

如何模拟请求和响应?
EN

Stack Overflow用户
提问于 2013-04-02 07:01:54
回答 12查看 296.3K关注 0票数 300

我正在尝试使用Pythons mock package来模拟Python的requests模块。让我在下面的场景中工作的基本调用是什么?

在我的views.py中,有一个函数可以进行各种requests.get()调用,每次都有不同的响应

def myview(request):
  res1 = requests.get('aurl')
  res2 = request.get('burl')
  res3 = request.get('curl')

在我的测试类中,我想做一些类似的事情,但是不能确定确切的方法调用

步骤1:

# Mock the requests module
# when mockedRequests.get('aurl') is called then return 'a response'
# when mockedRequests.get('burl') is called then return 'b response'
# when mockedRequests.get('curl') is called then return 'c response'

第2步:

调用我的视图

第3步:

验证响应是否包含“a response”、“b response”、“c response”

如何完成步骤1(模拟请求模块)?

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2013-04-03 05:56:27

以下是对我有效的方法:

import mock
@mock.patch('requests.get', mock.Mock(side_effect = lambda k:{'aurl': 'a response', 'burl' : 'b response'}.get(k, 'unhandled request %s'%k)))
票数 61
EN

Stack Overflow用户

发布于 2014-05-28 22:29:26

尝试使用responses library。下面是来自their documentation的一个示例

import responses
import requests

@responses.activate
def test_simple():
    responses.add(responses.GET, 'http://twitter.com/api/1/foobar',
                  json={'error': 'not found'}, status=404)

    resp = requests.get('http://twitter.com/api/1/foobar')

    assert resp.json() == {"error": "not found"}

    assert len(responses.calls) == 1
    assert responses.calls[0].request.url == 'http://twitter.com/api/1/foobar'
    assert responses.calls[0].response.text == '{"error": "not found"}'

它提供了一个相当好的便利,而不是设置所有的模仿自己。

还有HTTPretty

它不是特定于requests库的,虽然在某些方面更强大,但我发现它不太适合检查它拦截的请求,而responses很容易做到这一点

还有httmock

票数 201
EN

Stack Overflow用户

发布于 2015-05-09 04:43:22

我使用requests-mock为单独的模块编写测试:

# module.py
import requests

class A():

    def get_response(self, url):
        response = requests.get(url)
        return response.text

以及测试结果:

# tests.py
import requests_mock
import unittest

from module import A


class TestAPI(unittest.TestCase):

    @requests_mock.mock()
    def test_get_response(self, m):
        a = A()
        m.get('http://aurl.com', text='a response')
        self.assertEqual(a.get_response('http://aurl.com'), 'a response')
        m.get('http://burl.com', text='b response')
        self.assertEqual(a.get_response('http://burl.com'), 'b response')
        m.get('http://curl.com', text='c response')
        self.assertEqual(a.get_response('http://curl.com'), 'c response')

if __name__ == '__main__':
    unittest.main()
票数 42
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15753390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档