我想模拟客户端类到外部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方法和其他方法吗?
你可以试试这个。
@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 函数/方法/类时,一般需要指定返回值。