我尝试为我的一个功能编写一个测试用例。该函数如下所示:
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")
答案 0 :(得分:0)
您正以错误的方式进行操作。当您为某个功能编写测试时,应该只测试该功能本身,而不是测试其在运行期间调用的所有功能。
您要做的是模拟函数request_post_2
和request_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