我正在尝试使用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(模拟请求模块)?
发布于 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)))
发布于 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"}'
它提供了一个相当好的便利,而不是设置所有的模仿自己。
它不是特定于requests
库的,虽然在某些方面更强大,但我发现它不太适合检查它拦截的请求,而responses
很容易做到这一点
还有httmock。
发布于 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()
https://stackoverflow.com/questions/15753390
复制相似问题