我正在编写登录视图,并希望为视图添加单元测试。我的观点如下:
def login(request):
if request.POST:
usrname = request.POST.get('username')
password = request.POST.get('password')
user = authenticate(username=usrname, password=password)
if user is not None:
auth_login(request, user)
return redirect('/core/home/')
else:
context = {'error_message': "Invalid username or password"}
return render(request, 'core/login.html', context)
else:
c = {}
c.update(csrf(request))
return render_to_response('core/login.html',c)
def home(request):
if request.user.is_authenticated():
context = {'user' : request.user}
return render(request, 'core/home.html', context)
else:
return render(request, 'core/login.html')
我的单元测试看起来像这样:
class CoreViewTests(TestCase):
def setUp(self):
self.factory = RequestFactory()
def test_login_view_with_valid_user(self):
uf = UserFactory()
user = uf.make_user("ValidUser1", "12345", "user@abc.com")
self.assertEqual(user.username, "ValidUser1")
request = self.factory.post('/core/login', {"username": "ValidUser1", "password": "12345"})
response = login(request)
self.assertEqual(response.status_code, 200)
单元测试崩溃,因为它们无法找到会话对象。我通过定义虚拟会话字典来关注网站上的几个教程,但它没有帮助。
有人能为我解释如何为需要处理会话对象的视图编写单元测试吗?
感谢。
答案 0 :(得分:8)
来自RequestFactory
对象的文档:
它不支持中间件。如果视图需要正常运行,则必须由测试本身提供会话和身份验证属性。
如您所说,您可以尝试手动将request.session
设置为包含相应内容的字典。然而,使用旧式Django test client可能会更容易。
答案 1 :(得分:1)
类似这样: request.session = {'num_visits':0}