Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,是否可以在另一个请求中模拟请求?_Python_Django_Mocking_Django Unittest - Fatal编程技术网

在Python中,是否可以在另一个请求中模拟请求?

在Python中,是否可以在另一个请求中模拟请求?,python,django,mocking,django-unittest,Python,Django,Mocking,Django Unittest,在Django中,我有一个向外部API发出请求的视图。该视图位于my_应用程序中 类外部API视图(视图): def get(自我、请求、*args、**kwargs): ... external\u api\u response=requests.get(settings.external\u api\u URL) ... 对于它的单元测试,我使用以下函数作为@patch decorator的side_effect参数 def mock_requests_get_for_external_a

在Django中,我有一个向外部API发出请求的视图。该视图位于my_应用程序中

类外部API视图(视图):
def get(自我、请求、*args、**kwargs):
...
external\u api\u response=requests.get(settings.external\u api\u URL)
...
对于它的单元测试,我使用以下函数作为@patch decorator的side_effect参数

def mock_requests_get_for_external_api(*args,**kwargs):
类响应:
定义初始化(自身、内容、状态代码):
self.content=内容
self.status\u code=状态\u code
如果args[0]==settings.EXTERNAL\u API\u URL:
返回MockResponse(json.dumps('{“value”:1}'),200)
返回MockResponse(无,404)
。。。单元测试是这样进行的,没有任何问题:

@patch(“my_app.views.requests.get”,side_effect=mock_requests\u get_for_external_api)
def测试_外部_api(自身、模拟_获取):
response=self.client.get(settings.EXTERNAL\u API\u VIEW\u URL)
assert response.status_code==200
data=json.loads(response.content)
断言数据[“值”]==1
但是,我在同一个项目中有另一个视图,它调用此ExternalAPIView,如下所示:

class主视图(视图):
def get(自我、请求、*args、**kwargs):
...
response=requests.get(request.build\u absolute\u uri(settings.EXTERNAL\u API\u VIEW\u URL))
...
我想为这个MainView创建一个单元测试,它将通过settings.externalapiew\u API\u VIEW\u URL调用externalapiew,但在externalapiew内模拟外部API调用


一开始可能吗?如果是这样,我该怎么做呢?

这可以通过模拟对
请求的第二次调用来实现。获取
并保持第一次调用不变,类似于:

import requests

@patch("my_app.views.requests.get", side_effect=[requests.get, mocked_requests_get_for_external_api])
def test_main_view_api(self, mock_get):
    response = self.client.get(MAIN_VIEW_URL)
    assert response.status_code == 200
    data = json.loads(response.content)
    assert data["value"] == 1

这可以通过只模拟对
请求的第二个调用来实现。get
并保持第一个调用不变,例如:

import requests

@patch("my_app.views.requests.get", side_effect=[requests.get, mocked_requests_get_for_external_api])
def test_main_view_api(self, mock_get):
    response = self.client.get(MAIN_VIEW_URL)
    assert response.status_code == 200
    data = json.loads(response.content)
    assert data["value"] == 1

使用单元测试,您应该测试代码实现。您的MainView不调用ExternalAPIView,因此您不应该模拟对ExternalAPIView的调用。所以,要么我错过了什么,要么你没有解释你真正想要什么。谢谢@ipaleka的回复。MainView向执行ExternalAPIView的外部API视图URL地址发出请求。该ExternalAPIView向外部API URL发出请求。我想模拟对外部API URL的最后一次调用。很抱歉命名混乱。使用单元测试,您应该测试代码实现。您的MainView不调用ExternalAPIView,因此您不应该模拟对ExternalAPIView的调用。所以,要么我错过了什么,要么你没有解释你真正想要什么。谢谢@ipaleka的回复。MainView向执行ExternalAPIView的外部API视图URL地址发出请求。该ExternalAPIView向外部API URL发出请求。我想模拟对外部API URL的最后一次调用。很抱歉命名混乱。