pytest在一个函数中模拟多个请求

时间:2020-04-13 20:59:17

标签: python pytest

我尝试为我的一个功能编写一个测试用例。该函数如下所示:

def function(self):
    token = self.request_post_get_token()
    self.request_post_1(token)
    self.request_post_2(token)
    return 200

每个request_post测试是一个发布请求调用,它将返回200或401。 如何模拟每个post请求调用并返回200,并能够让我测试整个功能?

我正在使用pytest和patch.object。这是我写的东西,但我觉得自己做错了。

def test_function():
    Response = nameTuple('Response', 'status_code text')
    r = Response(200, "test")
    with patch.object(request, 'post', return_value = r):
        self.request_post_get_token()
        with patch.object(requests, 'post', return_value = r):
            self.request_post_1("token")
                with patch.object(requests, 'post', return_value = r):
                self.request_post_2("token")

2 个答案:

答案 0 :(得分:0)

您正以错误的方式进行操作。当您为某个功能编写测试时,应该只测试该功能本身,而不是测试其在运行期间调用的所有功能。

您要做的是模拟函数request_post_2request_post_1,并检查是否使用函数assert_called_once用令牌调用了它们

这是一个简单的例子

# Arrange
cls_obj = YourClass()
cls_obj.request_post_2 = Mock()
cls_obj.request_post_1 = Mock()

# Act
cls_obj.function()

# Assert
cls_obj.request_post_2.assert_called_with_once(token)
cls_obj.request_post_1.assert_called_with_once(token)

答案 1 :(得分:0)

假设每个请求在某种程度上都是唯一的,即没有重复的请求具有不同的返回值,则可以注册多个请求匹配器,这将为每个请求返回不同的结果。 https://requests-mock.readthedocs.io/en/latest/matching.html