Django单元测试POST更新Listings模型社交媒体字段失败问题
问题根因及解决方法
核心原因
你遇到的问题不是数据库没完成保存,而是测试代码中内存里的模型实例没有和数据库最新数据同步:
setUpTestData中创建的self.listing实例是缓存在内存中的,视图里修改数据库记录后,内存里的这个实例不会自动更新,所以你直接读取self.listing.listing_facebook拿到的还是初始创建时的None值。- 而
ListingsDescription的字段看起来正确,是因为Django的反向关联属性是懒加载的,第一次访问时才会触发数据库查询,所以你第一次调用self.listing.listingsdescription时拿到的是最新的数据库数据,才会符合预期。
解决方法
在断言之前主动刷新内存中的模型实例即可,调用Django模型自带的refresh_from_db()方法:
# 重定向断言完成后,先刷新实例数据 self.listing.refresh_from_db() # 再执行后续断言 self.assertEqual(self.listing.listingsdescription.space_description, "Lorem ipsum dolor") self.assertEqual(self.listing.listing_facebook, "https://www.facebook.com/listing/") self.assertEqual(self.listing.listing_instagram, "https://www.instagram.com/listing/")
额外排查方向
如果刷新实例后问题依然存在,可以按以下步骤排查:
- 检查
ListingForm的Meta.fields配置,确认listing_instagram、listing_facebook字段在允许提交的字段列表中,没有被exclude排除。 - 在测试的post请求提交后,直接从数据库重新查询记录验证数据是否正确写入,排除表单本身的问题:
listing_from_db = Listings.objects.get(id=self.listing.id) print(listing_from_db.listing_facebook) - 检查视图中表单保存的逻辑有没有额外的判断分支,确认
form_a.save()确实被执行,可以在保存逻辑处加临时日志,测试运行时验证是否走到了保存分支。 - 确认
ListingForm没有自定义重写save方法,或者重写的save方法中没有遗漏这两个字段的保存逻辑。
内容的提问来源于stack exchange,提问作者Saleh Rabbaniy
相关产品推荐
相关产品推荐

