Django如何模拟访问令牌

ix0qys7i  于 2023-05-19  发布在  Go
关注(0)|答案(1)|浏览(120)

我的测试用例中有以下代码。每当我运行测试用例时,都会生成一个新的令牌,这会耗尽我的配额。
因此,我想使用一些需要由APIClient成功验证的模拟值,而不是实际的令牌。如何模拟此令牌身份验证?
任何帮助都非常感谢。谢谢

设置

'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_simplejwt.authentication.JWTStatelessUserAuthentication',
],

测试用例

from apps.common.helpers import get_auth0_access_token

class TestDatasetListTestCase(APITestCase):
    def setUp(self):
        access_token = get_auth0_access_token()
        self.client.credentials(HTTP_AUTHORIZATION=f"Bearer {access_token}")

        payload = {"label": "new_label"}
        response = self.client.post(self.url, payload, format="multipart")

helpers.py

def generate_new_auth0_token()
    options = {
        "url": f"https://{auth0_domain}/oauth/token",
        "headers": {"cache-control": "no-cache", "content-type": "application/json"},
        "json": {"audience": audience, "grant_type": grant_type, "client_id": client_id, "client_secret": client_secret},
    }
    res = requests.post(**options)
    return res.json() or Exception(res.text)
hsvhsicv

hsvhsicv1#

在单元测试中,外部API的标准程序是模拟它们。在测试过程中调用这些API是没有意义的,因为除非另一端发生更改(例如更改API),否则这些API将正常工作,但在您的情况下,除非客户端服务器关闭,否则不会出现这种情况,因为您使用的是标准API(具有oAuth的固定规范集)。

class TestDatasetListTestCase(APITestCase):
   @mock.patch('apps.common.helpers.get_auth0_access_token')
   def test_access_token(self, mock_access_token):
        mock_access_token.return_value = SomeFactory().get_test_access_token()  # just using Factory pattern here, it can be hard coded string
        access_token = get_auth0_access_token()
        self.client.credentials(HTTP_AUTHORIZATION=f"Bearer {access_token}")

        payload = {"label": "new_label"}
        response = self.client.post(self.url, payload, format="multipart")

如果你仍然愿意测试APIClient,那么我建议你建立一个模拟的oAuth服务器,就像这个开源项目Mock oAuth Server。然后,您可以提供API调用的测试URL(或模拟它)。假设你的url是在设置中定义的,你可以这样尝试:

from django.test import override_settings

@override_settings(API_AUTH_URL='http://localhost:8989', CLIENT_SECRET='something', CLIENT_ID='else')
class TestDatasetListTestCase(APITestCase):

并更新helper函数:

def generate_new_auth0_token()
    options = {
        "url": f"https://{settings.API_AUTH_URL}/oauth/token",
        "headers": {"cache-control": "no-cache", "content-type": "application/json"},
        "json": {"audience": audience, "grant_type": grant_type, "client_id": settings.CLIENT_ID, "client_secret": settings.CLIENT_SECRET},
    }

有关设置覆盖的详细信息,请参阅文档。

相关问题