【问题标题】:'If' statement causing unit test to fail, but I don’t know why'If' 语句导致单元测试失败,但我不知道为什么
【发布时间】:2020-05-30 21:53:07
【问题描述】:

我有以下单元测试,但无法弄清楚它失败的原因(如果我删除 if(request.META.get('HTTP_REFERER') != request.build_absolute_uri(reverse('page1'))):,测试通过),但我不知道如何在它仍然存在的情况下使测试通过。

文件 tests.py

def test_redirects_after_POST(self):
        user = User.objects.create_superuser('username')
        self.client.force_login(user)

        response = self.client.post(
            reverse('page1'), data={
            'first_name': 'testuser',
            'dob': UnitTest.set_age(20)}
        )

        self.assertRedirects(response, reverse('page2'))

我试过添加这个,但没有帮助:

referer = 'http://testserver{}'.format(reverse('page1'))
# Also tried: referer = 'http://testserver{}'.format(reverse('page2'))
        response = self.client.post(
            reverse('page1'), data={
            'first_name': 'testuser',
            'dob': UnitTest.set_age(20)}
            , HTTP_REFERER=referer)

文件 views.py

@login_required
@allowed_users(allowed_roles=['admin', 'registered_user'])
def page1(request):

    if request.method == 'POST':
        form = Page1Form(request.POST, request.FILES, instance=request.user.page1)
        if form.is_valid():
            form.save()
            return redirect('page2')

    else:
        form = Page1Form(instance=request.user.page1)

    context = {
        'form' : form,
    }
    return render(request, 'website/page1.html', context)

@login_required
@allowed_users(allowed_roles=['admin', 'registered_user'])
def page2(request):

    if request.method == 'POST':
        form = Page2Form(request.POST, request.FILES, instance=request.user.page2)
        if form.is_valid():
            form.save()

            return redirect('page3')
    else:
        # redirect if user didnt access the page from page1
        if(request.META.get('HTTP_REFERER') != request.build_absolute_uri(reverse('page1'))):
            return redirect('page1')

        else:
            form = Page2Form(instance=request.user.page2)

    context = {
        'form' : form
    }

    return render(request, 'website/page2.html', context)

错误信息

AssertionError: 302 != 200 : Couldn't retrieve redirection page '/website/page2/': response code was 302 (expected 200)

【问题讨论】:

  • 302 是一个重定向,所以这是一个成功的 POST,从这个意义上说,测试是成功的
  • 哈哈哦。谢谢.. 我读到 302 是一个重定向,但是因为我的测试 self.assertRedirects(response, reverse('page2')) 失败,我认为它一定是出于其他原因重定向。你知道为什么那个测试失败了吗?如果它成功重定向 id,则期望该测试通过。编辑-这已得到回答。谢谢
  • 你说的“测试通过就是我去掉了检查”是什么意思
  • @PeterMortensen 抱歉,我更改了它以使其更清晰

标签: python django selenium django-testing django-tests


【解决方案1】:

你的请求成功了,但是你的测试失败了,因为你写错了expectations

如果您的请求使用了 follow 参数,则 expected_url 和 target_status_code 将是重定向链最后点的 url 和状态码。

但是,您的请求并未将 follow 设置为 true,因为它默认为 false。

【讨论】:

  • 啊,谢谢。下面的测试现在通过了:self.assertRedirects(response, reverse('needs_analysis'), status_code=302, target_status_code=302, fetch_redirect_response=True),虽然不应该 target_status_code=200,因为帖子应该重定向 (status_code=302),然后 page2 应该成功加载 (target_status_code=200)?
  • 需要在 self.client.post() 中添加 follow=True。那么 target_status_code 应该是 200。除非 page_2 由于引用不匹配而失败。 response["HTTP_LOCATION"] 说什么?
  • 啊,我需要将它添加到 POST。好的,我在 POST 之后添加了, follow=Trueself.assertRedirects(response, reverse('page2'), status_code=302, target_status_code=200, fetch_redirect_response=True) 告诉我Response redirected to '/website/page1/', expected '/website/page2/
  • 这应该可以。 HTTP_REFERER 应该通过 Client._handle_redirects() 保留在重定向中。您应该打印 response.redirect_chain 并在 page_2 中查看您要比较的两个值以查看差异。
  • 啊,是的,这是因为我在添加 follow=True 时愚蠢地删除了 HTTP_REFERER。在 POST 之后拥有这两个现在都通过了。这对我来说也很有意义。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多