Django自定义Brand模型Admin操作手动可用但单元测试无效果排查
排查思路
- 首先排查最可能的原因:Django模型实例内存快照未刷新
你Brand测试的断言全是读取测试初始化时创建的内存实例属性,而Admin操作修改的是数据库里的记录,内存里的实例不会自动同步。执行完merge_brands方法后,主动刷新需要断言的实例即可:
self.brand_admin.merge_brands(request, queryset) # 新增以下两行刷新实例 self.brand2.refresh_from_db() self.boot2.refresh_from_db()
你之前的Product测试能正常跑,是因为你断言用的是.count()方法,每次调用都会主动查询数据库,不需要刷新实例,才会出现两边测试表现不一致的情况,也正好对应你手动测试正常的表现——手动操作后页面会重新拉取数据库数据,不会用到内存旧快照。
检查
Brand模型的canonical布尔字段赋值
你merge_brands的逻辑里会遍历选中品牌,将canonical字段为True的品牌设为合并基准,你当前的测试代码只给brand1设置了canonical_brand = self.brand1,完全没有给canonical布尔字段赋值,如果该字段默认值为False,可能会导致合并基准选择不符合预期,可以在merge方法内打印canonical_brand的ID确认是否是你预期的brand1。确认Admin方法内部逻辑是否正常执行
可以在merge_brands方法开头加断点或者日志,确认测试执行时该方法有没有被调用、循环有没有正常进入、save()操作有没有被触发,排除方法内有权限校验、前置判断直接返回的情况。检查排序逻辑是否符合预期
你merge方法内用queryset.order_by("created_at")取默认合并基准,如果Brand模型的Meta配置了默认排序,或者created_at字段存在重复、赋值异常,可能导致取到的默认基准和你预期不一致,可以在测试内打印list(queryset.order_by("created_at"))的对象ID确认顺序。
内容的提问来源于stack exchange,提问作者Jonas Fagerlund
相关产品推荐
相关产品推荐

