我需要为几个Django中间件(Django > 1.10风格的中间件)编写单元测试。
项目是使用Django==2.2.3和djangorestframework==3.9.4实现的API,我正在使用标准的Django单元测试模块以及来自Django REST框架的APIRequestFactory()和APIClient()测试函数来创建用于我的测试的模拟请求。
这里是我想要测试的一个中间件的示例:
from . import models
class BrowserId():
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if hasattr(request, 'COOKIES') and 'mydomain.bid' in request.COOKIES:
bid = request.COOKIES.get('mydomain.bid', None)
else:
bid = None
request.bid = models.BrowserId(bid) if bid else models.BrowserId.random()
response = self.get_response(request)
response.set_cookie(
conf.BID_COOKIE_KEY,
value=request.bid,
max_age=conf.COOKIE_MAX_AGE,
domain=conf.BID_COOKIE_DOMAIN
)
return response
我希望进行测试:
浏览器ID已成功添加到请求中
Cookie已成功设置在响应中
因此,更准确地说,测试的一部分应该大致如下:
from rest_framework.test import APIRequestFactory, APIClient, APITestCase
from my_api.auth import middlewares, models
class MiddlewaresTestCase(APITestCase):
def test_fresh_browser_id_request(self):
??? SOME CODE TO PROCESS THE REQUEST BY THE MIDDLEWARE
assert hasattr(request, 'bid')
assert len(request.bid) == 30
def test_existing_browser_id_request(self):
req = APIRequestFactory().get('/')
mock_bid: str = 'abcd1234'
req.COOKIES = {cookie_key: mock_bid}
??? SOME CODE TO PROCESS THE REQUEST BY THE MIDDLEWARE
assert hasattr(req, 'bid')
assert req.bid == mock_bid
def test_browser_id_response(self):
mock_bid: str = 'abc123'
??? SOME CODE TO PROCESS THE REQUEST BY THE MIDDLEWARE
??? SOME CODE TO PROCESS THE REPONSE BY THE MIDDLEWARE
response = APIClient().get('/')
assert res.cookies.get(cookie_key) is not None
assert res.cookies.get(cookie_key).value == mock_bid
但是,正如你所看到的,我不知道如何单独完成这个任务。更确切地说:
我不知道在初始化中间件时应该传递什么样的
get_response
函数。我知道它应该是处理视图函数或下一个中间件,但我不知道如何传递它,无论如何我都想测试它,而不用管其他内容;我不知道如何仅测试已处理的请求而不测试返回的响应。
request
和response
对象即可。 - dirkgroten