W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
如果你只是想測試異步視圖的輸出,標(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):
...
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: