使用responses和pytest模拟query_params时视图收不到参数如何解决
问题根源
你当前的测试逻辑存在两个核心问题:
- 混淆了
responses库的作用范围:responses仅用于拦截、模拟你的代码主动向外发起的第三方HTTP请求,无法为你本地Django视图的入参传值 - 调用Django测试客户端的
get方法时,没有携带需要传入的query参数,所以视图自然接收不到对应值
解决方案
根据你的视图实际逻辑二选一即可:
情况1:视图内部不需要主动调用https://test.com接口
直接删除冗余的responses相关代码,在调用client.get时传入参数即可:
def test_receive(self, db, client): # 方式1:直接传data参数,Django测试客户端会自动转为GET请求的query参数 resp = client.get(reverse("my-url"), data={ "code": "some-code", "extra": "extra" }) # 方式2:手动拼接参数到URL后,写法等价 # resp = client.get(f"{reverse('my-url')}?code=some-code&extra=extra") assert resp.status_code == 200
情况2:视图内部确实需要主动调用https://test.com接口
保留responses的mock配置,同时补充测试客户端的传参即可:
@responses.activate def test_receive(self, db, client): # 这部分mock保留,用于拦截视图内部发起的对test.com的请求 responses.add( responses.GET, "https://test.com/?code=some-code&extra=extra", json={}, status=200, content_type="application/json", ) # 给当前视图的请求传入query参数 resp = client.get(reverse("my-url"), data={ "code": "some-code", "extra": "extra" }) assert resp.status_code == 200
内容的提问来源于stack exchange,提问作者Joey Fran
相关产品推荐
相关产品推荐

