Testing

Testing

REST框架包括幾個幫助類哭尝,可以擴展Django現(xiàn)有的測試框架只厘,并改進對API請求的支持涌献。

APIRequestFactory

擴展 Django 現(xiàn)有的 RequestFactory class.

Creating test requests

APIRequestFactory類支持與Django標(biāo)準的RequestFactory類幾乎相同的API描孟。這意味著標(biāo)準的.get(), .post(), .put(), .patch(), .delete(), .head() 和.options()方法都是可用的愧薛。

from rest_framework.test import APIRequestFactory

# Using the standard RequestFactory API to create a form POST request
factory = APIRequestFactory()
request = factory.post('/notes/', {'title': 'new idea'})
Using the format argument

創(chuàng)建請求體的方法,例如post, put 和 patch掏愁,包含一個 format 參數(shù)歇由,這使得使用除多表單數(shù)據(jù)之外的內(nèi)容類型可以輕松生成請求。 例如:

# Create a JSON POST request
factory = APIRequestFactory()
request = factory.post('/notes/', {'title': 'new idea'}, format='json')

默認可使用的格式有 'multipart''json'果港。為了與Django現(xiàn)有的 RequestFactory 兼容沦泌,默認格式為 'multipart'
要支持更廣泛的請求格式或更改默認格式辛掠,請參閱配置部分.

Explicitly encoding the request body

如果請求體中需要明確的編碼谢谦,你可以設(shè)置 content_type 標(biāo)志。例如:

request = factory.post('/notes/', json.dumps({'title': 'new idea'}), content_type='application/json')
PUT and PATCH with form data

Django RequestFactory和REST框架APIRequestFactory之間值得注意的一個區(qū)別是萝衩,多表單數(shù)據(jù)將被編碼用于除.post()以外的方法回挽。
例如,使用APIRequestFactory猩谊,您可以像這樣做一個PUT的表單請求:

factory = APIRequestFactory()
request = factory.put('/notes/547/', {'title': 'remember to email dave'})

使用Django的RequestFactory千劈,您需要自己對數(shù)據(jù)進行顯式編碼:

from django.test.client import encode_multipart, RequestFactory

factory = RequestFactory()
data = {'title': 'remember to email dave'}
content = encode_multipart('BoUnDaRyStRiNg', data)
content_type = 'multipart/form-data; boundary=BoUnDaRyStRiNg'
request = factory.put('/notes/547/', content, content_type=content_type)

Forcing authentication

當(dāng)直接使用請求工廠測試視圖時,能夠直接驗證請求通常很方便牌捷,而不必構(gòu)建正確的身份驗證憑據(jù)。
要強制驗證請求,請使用force_authenticate()方法沾凄。

from rest_framework.test import force_authenticate

factory = APIRequestFactory()
user = User.objects.get(username='olivia')
view = AccountDetail.as_view()

# Make an authenticated request to the view...
request = factory.get('/accounts/django-superstars/')
force_authenticate(request, user=user)
response = view(request)`

該方法的簽名是 force_authenticate(request,user = None捉捅,token = None)。 進行調(diào)用時鸿市,可以設(shè)置用戶和令牌中的一個或兩者锯梁。

例如即碗,當(dāng)使用令牌進行強制身份驗證時焰情,可能會執(zhí)行以下操作:

user = User.objects.get(username='olivia')
request = factory.get('/accounts/django-superstars/')
force_authenticate(request, user=user, token=user.token)

Note:當(dāng)使用 APIRequestFactory時,返回的是Django標(biāo)準的 HttpRequest剥懒,而不是Rest framwork 的Request對象内舟,該對象只有在生成視圖時生成。
這意味著直接在請求對象上設(shè)置屬性可能并不總是具有你所期望的效果初橘。 例如验游,直接設(shè)置.token將不起作用,直接使用.user只會在會話認證認證時有用保檐。

# Request will only authenticate if `SessionAuthentication` is in use.
request = factory.get('/accounts/django-superstars/')
request.user = user
response = view(request)

Forcing CSRF validation

默認情況下耕蝉,使用APIRequestFactory創(chuàng)建的請求在傳遞到REST框架視圖時不會應(yīng)用CSRF驗證。 如果需要明確地打開CSRF驗證夜只,可以在實例化工廠時設(shè)置enforce_csrf_checks標(biāo)志垒在。

factory = APIRequestFactory(enforce_csrf_checks=True)

Note:值得注意的是,Django的標(biāo)準RequestFactory不需要包含此選項扔亥,因為當(dāng)使用常規(guī)Django時场躯,CSRF驗證發(fā)生在中間件中,直接測試視圖時不會運行旅挤。 當(dāng)使用REST框架時踢关,CSRF驗證在視圖中進行,因此請求工廠需要禁用視圖級別的CSRF檢查粘茄。

APIClient

擴展了 Django 現(xiàn)有的 Client class.

Making requests

APIClinet 類支持與 Django標(biāo)準的Client類相同的接口签舞。這意味標(biāo)準的.get(), .post(), .put(), .patch(), .delete(), .head() 和 .options() 方法都是可用的。例如:

from rest_framework.test import APIClient

client = APIClient()
client.post('/notes/', {'title': 'new idea'}, format='json')

要支持更廣泛的請求格式或者改變默認格式柒瓣,請參閱配置部分儒搭。

Authenticating

.login(**kwargs)
登錄方法的功能與Django的常規(guī)Client類完全相同。 這允許您針對包括SessionAuthentication在內(nèi)的任何視圖驗證請求嘹朗。

# Make all requests in the context of a logged in session.
client = APIClient()
client.login(username='lauren', password='secret')

登出是通常調(diào)用 logout 方法师妙。

# Log out
client.logout()

登錄方法適用于測試使用會話認證的API,例如包含AJAX與API交互的網(wǎng)站屹培。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末默穴,一起剝皮案震驚了整個濱河市怔檩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蓄诽,老刑警劉巖薛训,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異仑氛,居然都是意外死亡乙埃,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門锯岖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來介袜,“玉大人,你說我怎么就攤上這事出吹∮錾。” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵捶牢,是天一觀的道長鸠珠。 經(jīng)常有香客問我,道長秋麸,這世上最難降的妖魔是什么渐排? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮灸蟆,結(jié)果婚禮上驯耻,老公的妹妹穿的比我還像新娘。我一直安慰自己次乓,他們只是感情好吓歇,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著票腰,像睡著了一般城看。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上杏慰,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天测柠,我揣著相機與錄音,去河邊找鬼缘滥。 笑死轰胁,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的朝扼。 我是一名探鬼主播赃阀,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼擎颖!你這毒婦竟也來了榛斯?” 一聲冷哼從身側(cè)響起观游,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎驮俗,沒想到半個月后懂缕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡王凑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年搪柑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片索烹。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡工碾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出术荤,到底是詐尸還是另有隱情倚喂,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布瓣戚,位于F島的核電站,受9級特大地震影響焦读,放射性物質(zhì)發(fā)生泄漏子库。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一矗晃、第九天 我趴在偏房一處隱蔽的房頂上張望仑嗅。 院中可真熱鬧,春花似錦张症、人聲如沸仓技。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脖捻。三九已至,卻和暖如春兆衅,著一層夾襖步出監(jiān)牢的瞬間地沮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工羡亩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摩疑,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓畏铆,卻偏偏與公主長得像雷袋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辞居,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理楷怒,服務(wù)發(fā)現(xiàn)寨腔,斷路器,智...
    卡卡羅2017閱讀 134,669評論 18 139
  • Django: csrf防御機制 csrf攻擊過程 1.用戶C打開瀏覽器率寡,訪問受信任網(wǎng)站A迫卢,輸入用戶名和密碼請求登...
    lijun_m閱讀 1,059評論 0 0
  • RxSwift_v1.0筆記——16 Testing with RxTest 100分 以上這是給你的,為了表揚你...
    大灰很閱讀 1,274評論 0 1
  • Unit Test What 什么是單元測試 Why 為什么要做單元測試 How 怎么做單元測試 What is ...
    Qingzh閱讀 522評論 0 1
  • Hit-testing翻譯為中文是"命中測試"冶共,是確定touch-point是否在一個View內(nèi)的過程,最終命中的...
    iOneWay閱讀 1,208評論 1 8