我有一个将包含JSON的POST发送到Elasticsearch实例的方法。我正在尝试编写一个单元测试来验证发送的JSON的内容,但是我不确定该如何进行。我应该在python中创建本地服务器并让其验证POST或其他内容吗?我目前有这个:
class TestAnalytics(BaseTest):
def test_post(self):
info = {"test1": "value1", "test2": "value2"}
resp = requests.post(config.tool_repo_urls['es_url'], data=json.dumps(info), headers={'Content-Type': 'application/json'})
assert_equal(resp.status_code, 200) # verify valid response code
答案 0 :(得分:2)
创建本地服务器将是一个过大的杀伤力,您可以做的是使用unitest库修补post()
方法,以便它使用修补方法将数据发送到内部声明方法,这里是链接{{3} }。您应该查看 27.6.2部分。贴片装饰器
示例:
class TestAnalytics(BaseTest):
@patch('requests.post')
def test_post(self,mock_post):
info = {"test1": "value1", "test2": "value2"}
resp = requests.post(config.tool_repo_urls['es_url'], data=json.dumps(info), headers={'Content-Type': 'application/json'})
#Some checks done on mock_post object
下面的完整示例 编辑:
import json
from unittest import TestCase
from unittest.mock import patch
import requests
class TestAnalytics(TestCase):
@patch('requests.post')
def test_post(self, mock_post):
info = {"test1": "value1", "test2": "value2"}
resp = requests.post("www.someurl.com", data=json.dumps(info), headers={'Content-Type': 'application/json'})
mock_post.assert_called_with("www.someurl.com", data=json.dumps(info), headers={'Content-Type': 'application/json'})
TestAnalytics().test_post()
方法assert_called_with
检查是否使用在调用中指定的参数精确调用了修补的方法。在这种情况下,它为True
将其更改为例如
mock_post.assert_called_with("www.someurl.com", data=json.dumps(info))
会给:
AssertionError: Expected call: post('www.someurl.com', data='{"test1": "value1", "test2": "value2"}')
Actual call: post('www.someurl.com', data='{"test1": "value1", "test2": "value2"}', headers={'Content-Type': 'application/json'})
您还可以使用mock_post
对象检查单个参数,请查看上面的链接以获取MagicMock
可以做什么的完整说明
EDIT2
最近发现了这个用于单元测试的小库requests
https://docs.python.org/3/library/unittest.mock-examples.html
答案 1 :(得分:0)
如果您想验证发送的JSON,则应尝试json.loads()
,如果您传递的输入不能被解码为JSON,则会抛出ValueError。