Django测试报"No User matches the given query"错误求助
问题根因
你手动使用RequestFactory实例化视图时,没有将路由携带的username参数绑定到视图实例的kwargs属性上,导致get_queryset方法中self.kwargs.get('username')取到的值为None,查询用户自然匹配不到结果,抛出404错误。
线上环境正常是因为Django的路由系统在接收到请求、调用视图前,会自动将URL路径中匹配到的参数填充到视图的kwargs属性中,不需要手动处理。
修复方案
方案1:在现有测试逻辑上补充参数绑定
只需要在view.setup(request)之后手动给视图的kwargs赋值即可,修改后的测试代码如下:
def test_get_queryset(self): """Testing get_queryset function""" url = reverse('user-posts', kwargs={'username': self.user.username}) request = self.factory.get(url) view = UserPostListView() view.setup(request) # 新增这行,手动绑定路由参数 view.kwargs = {"username": self.user.username} queryset = view.get_queryset() self.assertIn(self.post, queryset)
方案2:使用Django自带测试客户端简化测试
Django的TestCase自带测试客户端,会自动走完完整的请求、路由匹配、视图调用流程,不需要手动处理视图实例化和参数绑定,更适合这类视图功能测试,代码更简洁:
def test_get_queryset(self): """Testing get_queryset function""" url = reverse('user-posts', kwargs={'username': self.user.username}) response = self.client.get(url) # 验证页面正常返回 self.assertEqual(response.status_code, 200) # 验证测试帖子出现在页面对应上下文里 self.assertIn(self.post, response.context['posts'])
内容的提问来源于stack exchange,提问作者Sofya Kaminskaya
相关产品推荐
相关产品推荐

