【发布时间】: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.user?self.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