Модульное тестирование функции, которая потребляет запрос от django rest api view - PullRequest
0 голосов
/ 16 октября 2019

Я не уверен, как правильно тестировать функции, которые используются внутри классов представлений / разрешений.

Это полезная нагрузка моего запроса:

{"name": "John"}

И этофункция, которую я хочу проверить:

def get_name(request):
    return request.data['name']

Это представление, которое будет использовать функцию:

class SomeView(APIView):
    def get(self, request):
        name = get_name(request=request)
        return Response(status=200)

Как мне создать прибор для проверки функции get_name? Я пробовал это:

@pytest.fixture
def request_fixture()
    factory = APIRequestFactory()
    return factory.get(
        path='',
        data={"name": "John"},
        format='json')

def test_get_name(request_fixture):
    assert get_name(request=request_fixture) == "John"

Но я получаю ошибку: AttributeError: 'WSGIRequest' object has no attribute data.

Один обходной путь, кажется, декодирует атрибут body:

def get_name(request):
    data = json.loads(request.body.decode('utf-8'))
    return data['name']

Но это не совсем правильный способ сделать это, и я полагаю, что мне чего-то не хватает в классе WSGIRequest. Может кто-нибудь объяснить мне, как это должно быть проверено? Было бы здорово, если бы я мог использовать тот же прибор для проверки зрения.

1 Ответ

0 голосов
/ 16 октября 2019

Не думаю, что вам нужен тестовый прибор. Вы не тестируете весь вид, просто вспомогательную функцию. Вы можете очень легко создать объект, похожий на запрос, добавив свойство к лямбде:

def test_get_name():
    request = lambda: None
    request.data = {"name": "John"}
    assert get_name(request=request) == "John"
...