【问题标题】:Testing django view with form that contains ModelChoiceField使用包含 ModelChoiceField 的表单测试 django 视图
【发布时间】:2020-04-15 13:30:30
【问题描述】:

这是用于将数据发送到视图的表单:

class RegisterForm(forms.Form):
    username = forms.CharField(widget=forms.TextInput(attrs={
        'class': 'form-control',
        'placeholder': _('User Name')
    }))
    password = forms.CharField(widget=forms.PasswordInput(attrs={
        'class': 'form-control',
        'placeholder': _('Password')

    }))
    roles = forms.ModelChoiceField(queryset=Role.objects.exclude(role_name="Admin"), widget=forms.Select(attrs={
        'class': 'form-control',
    }))

这是正在测试其中的表单的视图:

def register(request):
    user = request.user
    current_user = CustomUser.objects.get(username=user.username)
    if current_user.role.role_name == "Admin":
        register_form = RegisterForm(request.POST)
        if request.method == "POST":
            if register_form.is_valid():
                username = register_form.cleaned_data['username']
                password = register_form.cleaned_data['password']
                role = register_form.cleaned_data['roles']
                if CustomUser.objects.filter(username=username).exists():
                    messages.error(request, _('Username already exists.'))
                else:
                    new_user = CustomUser.objects.create_user(username=username, password=password, role=role)
                    messages.success(request, _('User created Successfully'))
                    return redirect("user_details", pk=new_user.pk)
        else:
            register_form = RegisterForm(request.POST)
        context = {
            'register_form': register_form,
        }
        return render(request, 'register.html', context)
    else:
        messages.error(request, _('You are not allowed to view this page.'))
        return redirect('index')

这是我尝试通过发送带有数据的发布请求 (reverse) 来测试它的方法:

    def test_post_request_correct_date(self):
        call_command("start_app")
        self.client.login(username='user', password='pass')
        waiter_role = Role.objects.get(role_name="Waiter")
        url = reverse('register')
        data = {
            'username': 'new_user',
            'password': 'just good password',
            'roles': waiter_role.pk
        }
        response = self.client.post(url, data, follow=True)
        self.assertEqual(response.status_code, 302)
        new_user = CustomUser.objects.get(username="new_user")
        self.assertRedirects(response, reverse('user_details', args={"pk": new_user.pk}))
        self.assertTemplateUsed(response, 'user_profile.html')

请注意call_command("start_app") 是自定义命令,用于创建我从中选择的角色。

我得到这个错误:

    self.assertEqual(response.status_code, 302)
AssertionError: 200 != 302

【问题讨论】:

    标签: python django unit-testing django-forms


    【解决方案1】:

    我不是这方面的专家,但我相信如果您在帖子中设置follow=true,则响应中的status_code 将设置为redirect_chain 的最后一个元素的status_code - 即200。

    这基本上就是assertRedirects检查的内容,所以我认为这里是status_code的“手动”检查

    self.assertEqual(response.status_code, 302)
    

    是不必要的,可以删除。

    【讨论】:

      猜你喜欢
      • 2014-01-28
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      • 2020-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多