【问题标题】:Django test client - sendng POST data returns 400 errorDjango 测试客户端 - sendng POST 数据返回 400 错误
【发布时间】:2013-11-14 14:18:30
【问题描述】:

我在为 Django 编写测试时遇到问题(刚开始使用这个框架)。在浏览器中一切正常,但是当我使用 TestCase 时,请求方法似乎不是 POST。代码如下:

views.py:

def save(request, quiz_id):
    try:
        quiz = get_object_or_404(Quiz, pk=quiz_id)
        qset = Question.objects.filter(quiz=quiz_id)
    except IndexError:
        raise Http404
    questions = []
    if request.method == 'POST':
        f = QuizForm(request.POST, qset)
        if f.is_valid():
            do_stuff()
            return render(request, 'quiz/results.html', {'questions': questions})
    return HttpResponseBadRequest()

tests.py:

def test_results(self):
    post_data = {
        'ans10': 43,
        'ans6' : 28,
        'ans7' : 33,
        'ans8' : 36,
        'ans9' : 38,
    }
    resp = self.client.post('/1/save/', post_data)
    self.assertEqual(resp.status_code, 200)

并运行测试:

self.assertEqual(resp.status_code, 200)
AssertionError: 400 != 200

表单是有效的,传递的数据是正确的,在浏览器中,就像我说的,一切正常。我对这个测试有疑问,似乎请求方法不是 POST。感谢您的帮助。

【问题讨论】:

  • 请修正您的代码缩进。
  • 在文件中一切正常;)但我会修复。
  • 网址格式是什么?
  • 顺便说一句,get_object_or_404 可能会提高 Quiz.DoesNotExist,但它永远不会提高 IndexError
  • f not 有效的情况下,您应该返回或至少记录错误。您可能想向我们展示QuizForm 的代码。

标签: python django unit-testing testing post


【解决方案1】:

鉴于您的缩进损坏很难说,但如果它是一个 POST 请求并且表单有效,您的视图似乎只会返回 200。会不会是你的表单没有通过验证?

话虽如此,推荐的流程是在成功的帖子上返回一个重定向到结果页面(谷歌为“post redirect get”),以避免在页面重新加载时重复提交。

完全不相关,但您的 try/expect 块中的任何语句都不会引发 IndexError,如果 QuestionQuizz 上有一个 ForeignKey,您应该能够直接使用 quizz.question_set.all() 检索问题。

【讨论】:

    猜你喜欢
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    相关资源
    最近更新 更多