Django测试客户端返回404而不是200

时间:2017-08-06 15:26:36

标签: python django testing

我对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

1 个答案:

答案 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文档解释了很多这方面的内容,但并不总是那么清楚。但是如果你有测试期望数据,即使它是你在常规数据库中“永远”拥有的数据,它也不会在测试数据库中,除非你以某种方式专门添加它。

相关问题