Django 測試好幫手 - Request Factory

Posted on  Aug 20, 2017  in  Django  by  Amo Chen  ‐ 1 min read

Django 本身有提供方便的測試工具,譬如 Test Client 可以模擬瀏覽器的行為(但不是真實的瀏覽器,無法用來測試 Javascript) 。但除了用 Test Client 之外,其實也可以考慮直接用 Request Factory 產生 Request Object 丟進去 view function 進行測試。

執行環境

以下是本文的執行環境

  • Ubuntu 15
  • Python 3.5
  • Django 1.10.6
  • ipython 6.1.0

正文開始

本文可以在 Django project 目錄下使用以下指令,在 console 中執行本文所提供的範例:

$ ./manage.py shell

產生 Request Object 的方法很簡單,以下是產生 GET Request Object 的範例:

from django.test import RequestFactory
from django.contrib.auth.models import AnonymousUser

factory = RequestFactory()
request = factory.get('/')
request.user = AnonymousUser()

接著假設你有一個叫 index 的 view function :

from django.http import HttpResponse
from django.contrib.auth.models import AnonymousUser


def index(request, **kwargs):
    if isinstance(request.user, AnonymousUser):
        return HttpResponse('Please login')

    return HttpResponse('Hi {}'.format(request.user.username))

然後我們就可以把一開始產生的 request 丟進去 index 進行測試:

assert index(request).content == b'Please login'

如果要模擬已登入的使用者,就只要把 request.user 代換成 User object 即可:

request.user = User.objects.get(pk=....)

其他

除了 GET 之外, Request Factory 也有提供其他方法產生不同的 Request ,譬如 post(), put(), delete(), head(), options() 也能夠利用。

References

https://docs.djangoproject.com/en/1.11/topics/testing/advanced/#the-request-factory

FOLLOW US

對抗久坐職業傷害

研究指出每天增加 2 小時坐著的時間,會增加大腸癌、心臟疾病、肺癌的風險,也造成肩頸、腰背疼痛等常見問題。

然而對抗這些問題,卻只需要工作時定期休息跟伸展身體即可!

你想輕鬆改變現狀嗎?試試看我們的 PomodoRoll 番茄鐘吧! PomodoRoll 番茄鐘會根據你所設定的專注時間,定期建議你 1 項辦公族適用的伸展運動,幫助你打敗久坐所帶來的傷害!

贊助我們的創作

看完這篇文章了嗎? 休息一下,喝杯咖啡吧!

如果你覺得 MyApollo 有讓你獲得實用的資訊,希望能看到更多的技術分享,邀請你贊助我們一杯咖啡,讓我們有更多的動力與精力繼續提供高品質的文章,感謝你的支持!