python - Django 2.2 - 测试用例 - client.logout() 方法不注销用户
问题描述
我正在为我的简单 Django Web 应用程序编写测试,检查用户是否可以正确登录和注销。意见:user_login
和user_logout
def user_login(request):
if request.method == 'POST':
email = request.POST.get('email address')
password = request.POST.get('password')
user = authenticate(username=email, password=password)
if user:
if user.is_active:
login(request, user)
return HttpResponseRedirect(reverse('main_page:index'))
else:
print("\nWARNING: invalid login detected\n\nemail: {}\npassword: {}\n".format(email, password))
messages.error(request, 'Ivalid email or password. Try again.')
return HttpResponseRedirect(reverse('users:login'))
else:
return render(request, 'users/login.html', {})
@login_required
def user_logout(request):
messages.add_message(request, messages.INFO, 'See you Space Cowboy!')
logout(request)
return HttpResponseRedirect(reverse('main_page:index'))
以及测试本身:
class LoginLogoutTests(TestCase):
def setUp(self):
User = get_user_model()
self.user = User.objects.create_user(email='test_user@email.com', password='S6y4Mb9Aqfu79YcF')
print("\nsetup")
def tearDown(self):
self.user
print("teardown\n")
def test_login(self):
# test if email is equal
self.assertEqual(self.user.email, 'test_user@email.com')
# test authentication
self.assertTrue(self.user.is_authenticated)
self.assertFalse(self.user.is_anonymous)
# test if login request index.html
self.assertTrue(self.client.get('main_page.index.html'))
# test login with valid credentials
self.assertTrue(self.client.login(email='test_user@email.com', password='S6y4Mb9Aqfu79YcF'))
# test login with invalid credentials
self.assertFalse(self.client.login(email='test_user@email.com', password='password'))
print("test login")
def test_logout(self):
self.client.logout()
self.assertTrue(self.user.is_authenticated)
self.assertFalse(self.user.is_anonymous)
print("test logout\n")
测试返回此输出:
(venv) [user@manjaro django-project]$ ./manage.py test
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
setup
test login
teardown
setup
test logout
teardown
..
----------------------------------------------------------------------
Ran 2 tests in 0.515s
OK
Destroying test database for alias 'default'...
最后一个测试不应该通过,但自相矛盾的是。这里出了什么问题?
编辑:我重建了使用电子邮件作为登录名的用户模型。我使用了本教程:https ://testdriven.io/blog/django-custom-user-model/
解决方案
您还没有测试您的应用程序,您提供的那些视图与提供的测试没有任何共同之处。您已尝试测试 Django 本身,它的 TestCase 内部结构并未能正确测试它:在注销后执行与登录测试中类似的操作,断言您的客户端无法访问您的索引页面。
测试您的视图的正确方法是将客户端指向其相应的 URL,包括 AnonymousUser 和已登录的 URL。
推荐阅读
- react-native - 访问登录功能时跳过 SecureStore 并返回功能错误
- java - 如何使用特定行的 BufferedReader 从 Textfile 分配值?
- server - 如何将负载均衡器用于单片服务器
- css - 有没有办法定位 InnerHTML 使其位于普通 html 中的某些内容之下
- linux - linux内核如何知道在系统调用中作为参数传递的地址无效?
- git - Git重新标记理智和疯狂的建议
- android - Android ActionBar 在某些布局中消失了
- r - 在 R 中创建序列
- javascript - 如何验证括号'((()))''?
- python - 方法中的 Python 类属性