Django4.0 測試工具-測試異步代碼

2022-03-17 11:37 更新

如果你只是想測試異步視圖的輸出,標(biāo)準(zhǔn)測試客戶端將在自己的異步循環(huán)中運(yùn)行它們,而不需要你做任何額外的工作。

但是,如果你想為 Django 項目編寫完全異步的測試,你需要考慮到幾個問題。

首先,你的測試必須是測試類上的 ?async def? 方法(為了給它們一個異步的上下文)。Django 會自動檢測到任何 ?async def? 的測試,并將它們封裝在自己的事件循環(huán)中運(yùn)行。

如果你從一個異步函數(shù)進(jìn)行測試,你也必須使用異步測試客戶端。這在任何測試中都可以作為 ?django.test.AsyncClient? 或 ?self.async_client? 使用。

?AsyncClient? 具有與同步(普通)測試客戶端相同的方法和簽名,但有兩個例外:

不支持 ??follow ??參數(shù)。作為 ??extra ??關(guān)鍵字參數(shù)傳遞的頭信息不應(yīng)該有同步客戶端所要求的 ??HTTP_? ?前綴。例如,下面是如何設(shè)置 ?HTTP ?Accept?? 頭:

>>> c = AsyncClient()
>>> c.get(
...     '/customers/details/',
...     {'name': 'fred', 'age': 7},
...     ACCEPT='application/json'
... )

使用 ?AsyncClient ?任何提出請求的方法都必須被等待:

async def test_my_thing(self):
    response = await self.async_client.get('/some-url/')
    self.assertEqual(response.status_code, 200)

異步客戶端也可以調(diào)用同步視圖;它通過 Django 的 異步請求路徑 運(yùn)行,它支持這兩種方式。任何通過 ?AsyncClient ?調(diào)用的視圖都會得到一個 ?ASGIRequest ?對象作為它的 ?request?,而不是普通客戶端創(chuàng)建的 ?WSGIRequest?。

警告

如果你使用的是測試裝飾器,它們必須是異步兼容的,以確保它們正確工作。Django 內(nèi)置的裝飾器會正常工作,但第三方的裝飾器可能會出現(xiàn)無法執(zhí)行的情況(它們會“包裝”執(zhí)行流程中錯誤的部分,而不是你的測試)。
如果你需要使用這些裝飾器,那么你應(yīng)該用 ?async_to_sync()? 來裝飾你的測試方法:

from asgiref.sync import async_to_sync
from django.test import TestCase

class MyTests(TestCase):

    @mock.patch(...)
    @async_to_sync
    async def test_my_thing(self):
        ...


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號