Django测试异常:一个测试正常另一个报AssertionError错误
问题分析与解决方案
核心错误点
- 断言逻辑错误:你在
test_2post_added_to_page中错误地将res赋值为page_obj[0](单个Post实例),随后用assertIn检查目标Post是否在这个单个实例中,这完全不符合逻辑——assertIn要求右侧是可迭代集合(比如page_obj本身)。 - 实例不一致问题:
bulk_create返回的对象可能未正确填充数据库自动生成的字段(如主键id、创建时间pub_date),导致内存中的对象与数据库实际查询出的对象无法匹配。
修正后的测试代码
def test_2post_added_to_page(self): """ 13 posts - index FIXED """ # 批量创建13条Post Post.objects.bulk_create( [ Post( text=f'Тест {n}', author=self.user, group=self.group ) for n in range(13) ] ) # 从数据库重新获取目标Post,避免bulk_create实例的一致性问题 target_post = Post.objects.get(text='Тест 9') response = self.authorized_client.get(reverse('posts:index')) page_obj = response.context['page_obj'] # 直接检查目标Post是否在分页集合中 self.assertIn(target_post, page_obj)
额外注意事项
- 确认Post模型的
Meta类是否设置了正确的排序规则(比如ordering = ['-pub_date']),确保最新创建的Post排在前面。默认分页每页10条,加上setUpClass中创建的1条Post,你总共会有14条数据,第1页包含最新的10条,Тест 9确实在其中。 - 如果你的项目自定义了分页条数,需检查
settings.py中的PAGINATE_BY配置是否符合预期。
内容的提问来源于stack exchange,提问作者Pavel Serdukov
相关产品推荐
相关产品推荐

