我尝试为我的软件包进行可用的测试,但使用Flask.test_client
与我发现难以使用的requests
API非常不同。
我试图让requests.adapters.HTTPAdapter
包装回复,但看起来werkzeug
没有使用httplib
(或urllib
来构建)它拥有Response
个对象。
知道如何做到这一点?对现有代码的引用将是最好的(谷歌搜索werkzeug +请求不会给出任何有用的结果)
非常感谢!!
答案 0 :(得分:0)
据我所知,您需要的是嘲笑(请参阅What is Mocking?和Mock Object)。好吧,下面列出了几个选项:
如果您要仅模拟请求包,请使用requests-mock library来模拟请求包中的响应。
另一种选择是使用python mock libary模拟requests
模块,另见An Introduction to Mocking in Python
。
答案 1 :(得分:0)
您可以使用下面代码部分中定义的requests
方法。
要使用它,您还需要定义下面代码中显示的get_auth_headers
方法。
功能强>
自动设置请求标头。
Content-Type: Application/json
json
通过Basic Authentication
时构建的auth
。json
数据作为字符串转储到Flask测试客户端。requests.Response
对象<强>代码:强>
class MyTestCase(unittest.TestCase):
def setUp(self):
self.app = create_app('testing')
self.client = self.app.test_client()
self.app_context = self.app.app_context()
self.app_context.push()
db.create_all()
def tearDown(self):
db.session.remove()
db.drop_all()
self.app_context.pop()
def get_auth_headers(self, username, password):
return {
'Authorization':
'Basic ' + base64.b64encode(
(username + ':' + password).encode('utf-8')).decode('utf-8'),
'Accept': 'application/json',
'Content-Type': 'application/json'
}
def requests(self, method, url, json={}, auth=(), **kwargs):
"""Wrapper around Flask test client to automatically set headers if JSON
data is passed + dump JSON data as string."""
if not hasattr(self.client, method):
print("Method %s not supported" % method)
return
fun = getattr(self.client, method)
# Set headers
headers = {}
if auth:
username, password = auth
headers = self.get_auth_headers(username, password)
# Prepare JSON if needed
if json:
import json as _json
headers.update({'Content-Type': 'application/json'})
response = fun(url,
data=_json.dumps(json),
headers=headers,
**kwargs)
else:
response = fun(url, **kwargs)
self.assertTrue(response.headers['Content-Type'] == 'application/json')
return response
用法(在测试用例中):
def test_requests(self):
url = 'http://localhost:5001'
response = self.requests('get', url)
response = self.requests('post', url, json={'a': 1, 'b': 2}, auth=('username', 'password'))
...
与requests
的唯一区别在于,您不必输入requests.get(...)
,而是必须输入self.request('get', ...)
。
如果您确实需要requests
行为,则需要在{{1}周围定义自己的get
,put
,post
,delete
包装}}
注意:强>
执行此操作的最佳方法可能是Flask API documentation
中所述的requests
的子类化