我正在用django开发一个web应用程序,它使用表单post将用户输入的数据放入数据库中。在
问题: 测试使用self.client.post()英寸django.test.TestCase返回405(不允许请求)。在
排除:
问题: 当我预计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
这个问题让我很生气,这是唯一一个在搜索这个问题时出现的关于这个主题的问题。我不能说我有一个适当的修复,但我已经解决了它,我想我可能会分享几个小时的调试结果。在
我遇到了和您完全相同的问题,那就是POST请求在单元测试中不起作用,而在整个应用程序运行时它工作得非常好。在我的例子中,更疯狂的是这个测试在我的笔记本电脑上运行,而不是在我的台式机上,没有环境差异(相同的虚拟环境,只是python3.5.3与python3.5.1之间的细微差别)
我收到的信息是:
使用以下代码:
(我要发布到的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中所使用的版本相同)
相关问题 更多 >
编程相关推荐