如何在python中对POST方法进行单元测试?

Cit*_*tut 5 python post unit-testing

我有一个方法可以将包含 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
Run Code Online (Sandbox Code Playgroud)

mra*_*777 11

创建本地服务器将是一种矫枉过正,您可以做的是使用 unitest 库来修补该post()方法,以便它使用修补程序方法将数据发送到您的内部断言方法这里是链接https://docs.python.org/3/图书馆/unittest.mock-examples.html。您应该查看第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
Run Code Online (Sandbox Code Playgroud)

下面的完整工作示例 编辑:

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()
Run Code Online (Sandbox Code Playgroud)

方法assert_called_with检查是否使用调用中指定的参数准确调用了修补方法。在这种情况下它是真的

将其更改为例如:

mock_post.assert_called_with("www.someurl.com", data=json.dumps(info))
Run Code Online (Sandbox Code Playgroud)

会给:

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'})
Run Code Online (Sandbox Code Playgroud)

您还可以使用该mock_post对象来检查个人参数,请查看上面的链接以了解MagicMock可以做什么的完整规格

编辑2

最近发现了这个用于单元测试的小库 requests

https://github.com/getsentry/responses