Python 如何测试用户是否可以注册并重定向到主页?

Python 如何测试用户是否可以注册并重定向到主页?,python,django,authentication,testing,redirect,Python,Django,Authentication,Testing,Redirect,我正在编写测试,以查看用户是否可以注册,如果成功,将重定向到主页 views.py: class RegisterPageView(View): def get(self, request): if request.user.is_authenticated: return redirect('/') form = RegisterForm() return render(request, 're

我正在编写测试,以查看用户是否可以注册,如果成功,将重定向到主页

views.py:

class RegisterPageView(View):
      def get(self, request):
          if request.user.is_authenticated:
              return redirect('/')
          form = RegisterForm()
          return render(request, 'register.html', {'form': form})   

      def post(self, request):
          form = RegisterForm(request.POST)
          if form.is_valid():
              username = form.cleaned_data['username']
              password = form.cleaned_data['password']
              re_password = form.cleaned_data['re_password']
              first_name = form.cleaned_data['first_name']
              last_name = form.cleaned_data['last_name']
              email = form.cleaned_data['email']
              try:
                  user =  User.objects.get(username=form.cleaned_data['username'])
                  context= {'form': form, 'error':'The username you entered has already been taken. Please try another username.'}
                  return render(request, 'register.html', context)
              except User.DoesNotExist:
                  new_user = User(username=username, first_name=first_name, last_name=last_name, email=email)
                  new_user.set_password(password)
                  new_user.save()
                  return redirect('/')
          return render(request, 'register.html', {'form': form})
我创建了一个
class RegisterPageViewtest(TestCase):

具有以下功能:

def test_user_can_register(self):
    response = self.client.post(self.register_url,self.user,format='text/html')
    self.assertEqual(response.status_code,302)
但是,当我运行测试时,我会在控制台中得到响应:

AssertionError: 200 != 302
如何修复它?

您可以使用来验证所需的请求是否被重定向

SimpleTestCase.assertRedirects(响应,预期的url,状态代码=302,目标状态代码=200,消息前缀='',获取重定向响应=True)

断言响应返回状态\代码重定向状态,重定向到预期的\ url(包括任何GET数据),并且接收到带有目标\状态\代码的最终页面

如果您的请求使用了follow参数,则预期的_url和目标_status_代码将是重定向链最后一点的url和状态代码

如果fetch\u redirect\u响应为False,则不会加载最终页面。由于测试客户端无法获取外部url,因此如果预期的url不是Django应用程序的一部分,这将特别有用

在比较两个URL时,正确处理了方案。如果在重定向到的位置没有指定任何方案,则使用原始请求的方案。如果存在,则预期url中的方案是用于与进行比较的方案

此外,您还可以将
follow
关键参数传递给您的测试客户机,该参数将确定您的请求是否应该遵循任何重定向

post(路径,数据=None,内容类型=MULTIPART\u内容,follow=False,secure=False,**额外)

在提供的路径上发出POST请求并返回响应对象,如下所述

数据字典中的键值对用于提交POST数据

如果将follow设置为True,则客户端将遵循任何重定向,并且将在包含中间URL和状态代码元组的响应对象中设置redirect_chain属性


RegisterPageViewTest(TestCase)中出现打字错误:

应该是:

self.user={
        'username':'username',
        'password':'password',
        're_password':'password',
        'first_name':'first_name',
        'last_name':'last_name',
        'email':'email@gmail.com'
    }

你能用视图代码共享你的
视图吗?py
?根据要求,我添加了我的视图。py我应该使用两个给定的答案还是选择一个?@Borybar我相信你应该使用更适合你的答案,不过还是有一些奇怪的地方。您的响应返回200,这意味着它没有遭受重定向,因此您可以确定使用了视图中的哪个return语句吗?我建议在每次返回之前添加一个
print()
语句,看看终端打印的是哪一个。感谢您的时间和支持。我设法找到了一个解决办法,那就是打字错误。。。。在
setUp
中,它应该是're_password':'password'而不是'password2':'password'。
self.user={
        'username':'username',
        'password':'password',
        'password2':'password',
        'first_name':'first_name',
        'last_name':'last_name',
        'email':'email@gmail.com'
    }
self.user={
        'username':'username',
        'password':'password',
        're_password':'password',
        'first_name':'first_name',
        'last_name':'last_name',
        'email':'email@gmail.com'
    }