测试时如何修改Django admin SimpleListFilter的查询参数值
Django SimpleListFilter 测试时自定义
value()返回值方案 核心原理
Django内置的SimpleListFilter的value()方法默认逻辑是从当前请求的GET参数中读取过滤器对应的parameter_name属性对应的值,且会将读取结果缓存到实例的_value属性中,避免重复计算。
可用实现方案
根据你的测试场景不同,可选择以下任意一种方案:
1. 集成测试场景(走完整请求流程)
如果是用Django测试客户端模拟Admin列表页请求,直接在请求的GET参数中传入过滤器对应的参数即可,无需修改过滤器本身代码:
- 首先确认你的自定义过滤器的
parameter_name属性值,假设为delete_status - 测试请求时直接携带对应参数:
client.get("/admin/yourapp/yourmodel/?delete_status=deleted") - 此时过滤器内部调用
self.value()自然会返回你传入的deleted值,完全符合生产环境的实际运行逻辑,优先推荐该方案。
2. 单元测试场景(单独测试过滤器逻辑)
如果只需单独实例化过滤器测试queryset方法,不需要走完整请求链路,可以直接修改实例的缓存属性或者重写value方法:
方案A:直接覆盖缓存属性
# 实例化过滤器,依次传入request、参数、对应模型、Admin实例 filter_inst = YourCustomFilter(request, {}, YourModel, YourModelAdmin) # 直接给缓存属性赋值,后续调用value()就会返回该值 filter_inst._value = "your_expected_value"
方案B:动态重写value方法(适合需要动态返回值的场景)
def mock_value(self): # 这里可以写任意你需要的逻辑 return "dynamic_custom_value" # 给实例绑定自定义的value方法 filter_inst.value = mock_value.__get__(filter_inst, YourCustomFilter)
注意事项
不要直接修改过滤器类的value方法,避免影响其他测试用例的运行,所有修改都应该限定在单个测试用例的实例范围内。
内容的提问来源于stack exchange,提问作者Shmuelt
相关产品推荐
相关产品推荐

