Django4.0 測(cè)試工具-測(cè)試異步代碼

2022-03-17 11:37 更新

如果你只是想測(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):
        ...


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)