W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
如果你只是想測(cè)試異步視圖的輸出,標(biāo)準(zhǔn)測(cè)試客戶端將在自己的異步循環(huán)中運(yùn)行它們,而不需要你做任何額外的工作。
但是,如果你想為 Django 項(xiàng)目編寫完全異步的測(cè)試,你需要考慮到幾個(gè)問題。
首先,你的測(cè)試必須是測(cè)試類上的 ?async def
? 方法(為了給它們一個(gè)異步的上下文)。Django 會(huì)自動(dòng)檢測(cè)到任何 ?async def
? 的測(cè)試,并將它們封裝在自己的事件循環(huán)中運(yùn)行。
如果你從一個(gè)異步函數(shù)進(jìn)行測(cè)試,你也必須使用異步測(cè)試客戶端。這在任何測(cè)試中都可以作為 ?django.test.AsyncClient
? 或 ?self.async_client
? 使用。
?AsyncClient
? 具有與同步(普通)測(cè)試客戶端相同的方法和簽名,但有兩個(gè)例外:
不支持 ??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
?任何提出請(qǐng)求的方法都必須被等待:
async def test_my_thing(self):
response = await self.async_client.get('/some-url/')
self.assertEqual(response.status_code, 200)
異步客戶端也可以調(diào)用同步視圖;它通過(guò) Django 的 異步請(qǐng)求路徑 運(yùn)行,它支持這兩種方式。任何通過(guò) ?AsyncClient
?調(diào)用的視圖都會(huì)得到一個(gè) ?ASGIRequest
?對(duì)象作為它的 ?request
?,而不是普通客戶端創(chuàng)建的 ?WSGIRequest
?。
如果你使用的是測(cè)試裝飾器,它們必須是異步兼容的,以確保它們正確工作。Django 內(nèi)置的裝飾器會(huì)正常工作,但第三方的裝飾器可能會(huì)出現(xiàn)無(wú)法執(zhí)行的情況(它們會(huì)“包裝”執(zhí)行流程中錯(cuò)誤的部分,而不是你的測(cè)試)。
如果你需要使用這些裝飾器,那么你應(yīng)該用 ?async_to_sync()
? 來(lái)裝飾你的測(cè)試方法:
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號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: