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