Django登录功能测试失败求助:NoReverseMatch及表单路径错误
Django登录功能测试失败问题排查与修复
你遇到的两个核心问题:NoReverseMatch反向解析错误,以及表单路径匹配断言失败,都是代码细节没对齐测试要求导致的,下面是具体修复步骤:
一、解决NoReverseMatch错误
你的登录URL已经注册在accounts命名空间下(app_name = "accounts"),但测试代码里直接用reverse("login"),没有指定命名空间,Django找不到对应的URL。需要修改测试代码中所有调用reverse("login")的地方,改为reverse("accounts:login")。
修改后的测试代码(涉及3个测试方法):
# test_login_resolves_to_accounts_login方法 def test_login_resolves_to_accounts_login(self): path = reverse("accounts:login") # 此处修改 self.assertEqual( path, "/accounts/login/", msg="Could not resolve path name 'login' to '/accounts/login/", ) # test_login_works方法 def test_login_works(self): User.objects.create_user("noor", password="1234abcd.") response = self.client.post( reverse("accounts:login"), # 此处修改 {"username": "noor", "password": "1234abcd."}, ) self.assertEqual( response.status_code, 302, msg="Login does not seem to work", ) # test_login_fails_for_unknown_user方法 def test_login_fails_for_unknown_user(self): response = self.client.post( reverse("accounts:login"), # 此处修改 {"username": "noor", "password": "1234abcd."}, ) self.assertEqual( response.status_code, 200, msg="Login does not seem to work", )
二、解决表单路径匹配失败问题
测试期望表单位于html > body > main > div > form路径下,但你的HTML里<form>和<div>是同级(都在<main>下),需要把<form>移动到<div>内部。
修改后的accounts/templates/accounts/login.html:
<!DOCTYPE html> <html> <head> <title>Login</title> </head> <body> <main> <div> <h1>Login</h1> <!-- 将form移入div内部 --> <form method="post"> {% csrf_token %} {{ form }} <button type="submit">Login</button> </form> </div> </main> </body> </html>
完成以上两处修改后,重新运行python manage.py test tests.test_feature_07,所有测试应该就能通过了。
内容的提问来源于stack exchange,提问作者bobby joe
相关产品推荐
相关产品推荐

