如何在 Django 中使用 Pytest 测试经过身份验证的 POST 请求

Mic*_*gas 5 python django automated-tests pytest django-rest-framework

我想使用 Pytest 在 API 上测试经过身份验证的发布请求。这是我目前正在做的事情:

 def test_auth_user_can_create(self, client):
      
    
    url = api_reverse('crud-simulation_api')

    data = {
        "project": "testproject",
        ....
    }

        response = client.post(url, json=data)
        assert response.status_code == 200
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为它返回 401(未授权)而不是 200。这是有道理的,因为夹具是客户端而不是管理员客户端。

然而,如果我传入 admin_client 而不是 client,它会给我一个错误的请求。不过,我发送的数据应该没问题。

我也尝试像这样传递标头(因为我使用 JWT 授权):

token = "bigassstringwhichismytoken"

headers = {
        "Authorization": "JWT " + token
    }
Run Code Online (Sandbox Code Playgroud)

最后我尝试登录之前给了我一个 403 (Forbidden):

def test_auth_user_can_create_simulation_api(self, client, django_user_model):
     
    username = "Jack"
    password = "password"

    django_user_model.objects.create_user(username=username, password=password)
    client.login(username=username, password=password)

    url = api_reverse('crud-simulation_api')

    data = {
        "project": "testproject",
        ...
    }

    response = client.post(url, json=data)
    assert response.status_code == 200
Run Code Online (Sandbox Code Playgroud)

如果有人能指出我正确的方向,那就太棒了!非常感谢提前

Sam*_*Sam 2

您可以使用用户名和密码点击登录网址并获取令牌。创建一个标题字典,例如headers = {'Authorization': 'JWT <token>'}

并在使用帖子时使用标题。

client.post(url, json=data, headers=headers)
Run Code Online (Sandbox Code Playgroud)