【问题标题】:Unit testing a function which consumes request from django rest api view单元测试一个使用来自 django rest api 视图的请求的函数
【发布时间】:2019-10-16 10:36:33
【问题描述】:

我不确定测试视图/权限类中使用的函数的正确方法是什么。

这是我的请求的有效负载:

{"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 类的一些内容。有人可以向我解释它应该如何测试吗?如果我也可以使用相同的夹具来测试视图,那就太好了。

【问题讨论】:

    标签: python django rest unit-testing django-rest-framework


    【解决方案1】:

    我认为您不需要测试夹具。您没有测试整个视图,只是一个辅助函数。您可以通过向 lambda 添加属性来非常轻松地创建类似请求的对象:

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

    【讨论】:

    • 我已经使这个示例尽可能简单,但是想象一下请求负载是一个巨大的字典,并且还有其他功能需要使用相同的负载进行测试 - 夹具很方便。当然,我可以使用Mock,但我真的很想在适当的类上测试该函数。不可能吗?
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    相关资源
    最近更新 更多