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