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

成都創(chuàng)新互聯(lián)成立與2013年,先為海門等服務(wù)建站,海門等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為海門企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
但是,如果你想為 Django 項目編寫完全異步的測試,你需要考慮到幾個問題。
首先,你的測試必須是測試類上的 ?async def? 方法(為了給它們一個異步的上下文)。Django 會自動檢測到任何 ?async def? 的測試,并將它們封裝在自己的事件循環(huán)中運行。
如果你從一個異步函數(shù)進行測試,你也必須使用異步測試客戶端。這在任何測試中都可以作為 ?django.test.AsyncClient? 或 ?self.async_client? 使用。
?AsyncClient? 具有與同步(普通)測試客戶端相同的方法和簽名,但有兩個例外:
不支持 ??follow ??參數(shù)。作為 ??extra ??關(guān)鍵字參數(shù)傳遞的頭信息不應該有同步客戶端所要求的 ??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 的 異步請求路徑 運行,它支持這兩種方式。任何通過 ?AsyncClient ?調(diào)用的視圖都會得到一個 ?ASGIRequest ?對象作為它的 ?request?,而不是普通客戶端創(chuàng)建的 ?WSGIRequest?。
警告
如果你使用的是測試裝飾器,它們必須是異步兼容的,以確保它們正確工作。Django 內(nèi)置的裝飾器會正常工作,但第三方的裝飾器可能會出現(xiàn)無法執(zhí)行的情況(它們會“包裝”執(zhí)行流程中錯誤的部分,而不是你的測試)。
如果你需要使用這些裝飾器,那么你應該用 ?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):
...
本文名稱:創(chuàng)新互聯(lián)Django4.0教程:Django4.0測試工具-測試異步代碼
鏈接URL:http://m.fisionsoft.com.cn/article/djsspoi.html


咨詢
建站咨詢
