为 pytest 模拟外部 api 客户端类

问题描述 投票:0回答:1

我想模拟客户端类到外部API:

class ExternalApiClient:

def __init__(self, request: HttpRequest):
    session = getattr(request, "session", None)

    self.cars = ExternalApiCarsClient(request)

这是我的应用程序中的新功能,任何我的 pytest 都需要它再次工作,因为视图在每个操作中都使用此ExternalApiClient:

class CarView(viewsets.ModelViewSet):
    def update(self, request, *args, **kwargs):
       ...some_code...
            

       client = ExternalApiClient(request)
       client.cars.some_method()

       return Response(status=status.HTTP_200_OK)

我阅读了unittest.mock文档并尝试这样做:

@patch('path.to.file.ExternalApiClient', NewMockedClass)
def test_car_update(self):
    ...some_code...
    self.client.patch(car_detail_url) # this patch using update method from CarView

但它不起作用。我的CarView仍然使用ExternalApiClient而不是NewMockedClass。我可以以某种方式模拟整个ExternalApiClient或者至少单独模拟这个类的init方法和其他方法吗?

python django unit-testing mocking pytest
1个回答
0
投票

你可以试试这个。

@patch('path.to.ExternalApiClient')
def test_car_update(self, mock_client_class):

  mock_client = Mock()
  mock_client_class.return_value = mock_client

  with patch('path.to.view.client', mock_client):

     # make requests to view

     assert mock_client.cars.some_method.called

您可以根据需要直接模拟类、init 方法或直接模拟实例。在上面的例子中,我直接mock了实例。

mock 函数/方法/类时,一般需要指定返回值。

© www.soinside.com 2019 - 2024. All rights reserved.