You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 01:24:07