我对Django很新并且正在测试......
我正在测试我的应用,每次执行threads_page = self.client.get('/threads/1/')
时,它都会返回404状态而不是200(该网址有效,1是主题ID)。
我找到了一个有相同问题的帖子,并且对问题(Django test client get returns 404 however works in shell)有回应,但我仍然不知道如何解决它。 问题是在我的视图中我有一个带参数的get_object_or_404,但我不知道如何在测试中传递参数:
views.py
def threads(request, subject_id):
subject = get_object_or_404(Subject, pk=subject_id)
return render(request, 'forum/threads.html', {'subject': subject})
这是我现在的测试
def test_check_threads_content_is_correct(self):
threads_page = self.client.get('/threads/1/')
self.assertEqual(threads_page.status_code, 200)
谢谢!
*这是我在Github中的代码,如果有帮助的话 https://github.com/IreneG5/we_are_social_forum
答案 0 :(得分:0)
我遇到过非常类似的问题。我从来没有真正找到问题,并使用了2个网址 - 一个有参数,一个没有。在views.py中,我将def threads(request, subject_id):
更改为def threads(request, subject_id=None):
,然后在函数顶部添加:
if not subject_id:
subject_id = request.GET.get('subject')
在我的测试中:
threads_page = self.client.get('/threads/', {'subject': '1'})
如果某人的答案与网址中的参数一起使用,那么请改为使用该答案 - 我也会使用它!但如果没有,那么这应该完成工作。
Django测试的另一个重要部分 - 测试数据库。
测试通常使用一个单独的,每个测试数据库开始为空。有几种方法可以将数据放入数据库。基本概念是,通过在“测试数据库”而不是生产数据库上运行测试,您可以精确控制数据库中的确切内容,以便您的测试将是一致的,以便进行任何测试(例如,删除测试) )不会搞砸你的生产数据。我花了一段时间才了解这一切。 Django文档解释了很多这方面的内容,但并不总是那么清楚。但是如果你有测试期望数据,即使它是你在常规数据库中“永远”拥有的数据,它也不会在测试数据库中,除非你以某种方式专门添加它。