【问题标题】:Django unittest assertRedirects explanation of workDjango unittest assertRedirects 工作说明
【发布时间】:2019-10-11 14:08:49
【问题描述】:

我需要解释 assertRedirects 函数的工作。我的看法:

def login_view(request):
    if request.user.is_authenticated:
        return redirect('account:profile')
    else:
        form = UserLoginForm(request.POST or None)
        if request.method == 'POST':
            if form.is_valid():
                cd = form.cleaned_data
                user = authenticate(username=cd['username'],
                                    password=cd['password'])
                if user is None:
                    messages.error(request,
                                   'something.')
                else:
                    if user.is_active:
                        login(request, user)
                        next_url = request.POST.get('next',
                                                    reverse('account:profile'))
                        return HttpResponseRedirect(next_url)
                    else:
                        messages.error(request,
                                       'something')
            else:
                messages.error(request, 'something.')

        context = {'form': form,
                   'next': request.GET.get('next')}
        return render(request, 'account/login.html', context)

现在我写了 2 个测试。

def test_login_view_valid_data_username(self):
    path = reverse('account:login')
    response = self.client.post(path=path,
                                data={'username': 'test123',
                                      'password': 'everything123'})
    # is logged
    self.assertTrue(self.user.is_authenticated)
    # is redirect and good redirected
    self.assertRedirects(response, reverse('account:profile'))

我的观点通过了这个测试。我的第二个测试:

def test_redirect_url_if_not_login(self):
    path = '{}?next={}'.format(reverse('account:login'),
                               reverse('orders:create'))
    response = self.client.post(path=path,
                                data={'username': 'test123',
                                      'password': 'everything123',
                                      'next': reverse('orders:create')})
    print('RESPONSE CODE', response.status_code)
    print('RESPONSE URL', response.url)
    self.assertRedirects(response, reverse('orders:create'))

这里我有问题。我收到错误:
AssertionError: 302 != 200 : 无法检索重定向页面“/orders/create/”:响应代码为 302(预期为 200)
但我的响应代码和响应 url 对于反向路径是正确的。我有点困惑,因为这样的情况不是第一个。有什么正式的解释吗?

编辑:

@login_required
def create_view(request):
    cart = Cart(request)

    if len(cart) == 0 or not cart:
        return redirect('shop:overview')

    if request.method == 'POST':
        form = OrderCreateForm(request.POST)
        if form.is_valid():
            order = form.save(commit=False)
            order.user = request.user
            order.save()
            for item in cart:
                OrderItem.objects.create(order=order,
                                         product=item['product'],
                                         price=item['price'],
                                         quantity=item['quantity'])
            cart.clear()
            return redirect('orders:payment', id=order.id)
    else:
        data = model_to_dict(request.user.shippingdetails)

        form = OrderCreateForm(data)

    return render(request, 'orders/create.html', {'cart': cart,
                                                  'form': form})

感谢您的任何回答
马格努斯

【问题讨论】:

  • 你在哪里设置self.userself.user.is_authenticated 正在测试测试类的用户。这与在测试客户端中测试用户不同。
  • 自我。用户在 setUp 函数 self.user = User.objects.create_user(username='test123', email='testowy@gmail.com', password='everything123') 中定义。两个测试重定向页面,在一个测试中它与 assertRedirections 函数一起使用,但在第二个测试中不是。第二次测试返回正确的响应代码 - 302,正确的 url /orders/create/' 但 assertRedirects 失败。
  • 尝试将 follow=True 添加到 self.client.post(...),然后 print(response.redirect_chain)` 以查看您被重定向到的位置。
  • 两个测试转到else case,而不是在if条件下停止。
  • 看。第一次测试 RESPONSE CODE 302 RESPONSE URL /account/profile/ 跨度>

标签: python django unit-testing


【解决方案1】:

默认情况下,assertRedirects 获取目标 URL 并期望状态为 200。

在您的情况下,您的视图重定向到 /orders/create/,然后重定向到 /。您可以设置fetch_redirect_response=False 以防止测试客户端获取/orders/create/,或设置target_status_code=302

【讨论】:

    猜你喜欢
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多