405在Django应用程序中测试POST时出错,该应用程序完全正常

2024-05-23 20:29:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用django开发一个web应用程序,它使用表单post将用户输入的数据放入数据库中。在

问题: 测试使用self.client.post()英寸django.test.TestCase返回405(不允许请求)。在

排除:

  • POST disallowed-应用程序在运行时成功发布(与when相反测试.py运行)。在
  • CSRF问题-django.test.TestCase运行测试时,默认情况下禁用CSRF身份验证。在
  • 测试中断了一般-我有几个测试工作良好使用self.client.get()

问题: 当我预计302(重定向)时,是什么导致了405?在

这是其中一个以这种方式失败的测试:

def test_process_one_match_in_title(self):
    #TODO: the server is refusing self.client.post requests in testing, although they work in the app proper.  Why?

    #create a user and an abstract
    this_abstract = Abstract.objects.get(pk=5)  #'hypoplasia' in both title and abstract text
    this_annotator = create_annotator("Joe")
    this_annotator.save()

    userMatchesJSON = "{'hypoplasia': 8}"

    resp = self.client.post(reverse('diseaseMatcherApp:abstractDetail', kwargs={'pk': this_abstract.id}),
                            {'inputSoFar': 'hypoplasia', 'abstract_pk': this_abstract.id, 'user.id': this_annotator.id,
                             'userMatches': userMatchesJSON})
    self.assertEqual(resp.status_code, 302)  #FAILS HERE; AssertionError: 405 != 302

Tags: djangointestselfclientabstractid应用程序
1条回答
网友
1楼 · 发布于 2024-05-23 20:29:23

这个问题让我很生气,这是唯一一个在搜索这个问题时出现的关于这个主题的问题。我不能说我有一个适当的修复,但我已经解决了它,我想我可能会分享几个小时的调试结果。在

我遇到了和您完全相同的问题,那就是POST请求在单元测试中不起作用,而在整个应用程序运行时它工作得非常好。在我的例子中,更疯狂的是这个测试在我的笔记本电脑上运行,而不是在我的台式机上,没有环境差异(相同的虚拟环境,只是python3.5.3与python3.5.1之间的细微差别)

我收到的信息是:

  • “不允许的方法(POST):url/where/i/wanted/to/POST”与测试方法名称交错(当与一起运行时)/管理.py试验-v2)
  • “test sum-up”中的断言错误:“AssertionError:False不为true:响应未按预期重定向:响应代码为405(预期302)”

使用以下代码:

r = self.client.post(url, follow=True)
self.assertRedirects(r, expected_url)

(我要发布到的URL是由CreateView派生的类处理的)

第一条消息是从this piece of code发出的,它是通过this line触发的

^{pr2}$

。。。与请求.方法设置为“POST”。。。结果我的CreateView在测试模式下没有任何“post”方法(这很奇怪。。。显然,当在我的笔记本电脑上运行时,view有这个功能!),所以Django转而使用“http”方法“不允许”。在

为什么我的CreateView没有“POST”方法?我没有花时间来完成整个init过程(这看起来相当复杂),所以我没有确切的想法,但是在我的例子中,一些url在我的测试中根本没有被“初始化”(我可以通过在urls/resolvers.py中打印这个函数中的内容来解决这个问题)。例如,在运行测试时,用来处理POST请求的URL实际上不存在。。。所以我想这就解释了为什么我的CreateView没有正确初始化

我终于发现,我的问题来自于使用django crudbuilder应用程序构建CRUD视图,当数据库为空时,它无法正确初始化(在非持久性数据库上运行测试时就是这种情况)

在其他情况下,不确定问题可能来自何处,但如果遇到这种情况,您可能会希望检查Django在运行测试时是否正确地“看到”了所有的url(如果没有,请尝试找出原因)。

(我链接的Django源代码来自当前的主版本,但它与我在使用的版本1.11.7中所使用的版本相同)

相关问题 更多 >