Pytest未触发异常排查:接口测试返回200而非预期500
问题根源:Mock路径错误
你遇到的核心问题是mock的路径不对——你patch的是app.usecase.bulk.bulk_insert,但接口代码里实际调用的bulk_insert并不是这个路径下的对象,而是被导入到接口模块后的副本,导致mock完全没生效。
验证方法
在接口代码里加一行打印,确认bulk_insert的实际模块路径:
@blueprint.post("/bulk") @validate() def bulk(body: BulkRequestBody) -> tuple[BulkResponseBody, int]: print(bulk_insert.__module__) # 打印实际模块路径 try: bulk_insert(body.items) return BulkResponseBody(ok=True), 200 except: # noqa pass return BulkResponseBody(ok=False), 500
运行测试,输出的内容就是你需要patch的正确路径。
修正后的测试用例
假设接口代码所在文件是app/api/v1/bulk.py,且导入语句是from app.usecase.bulk import bulk_insert,那测试用例里要patch接口模块中的引用:
def test_bulk_500(mocker, client): # 改成接口模块里的bulk_insert路径 mocker.patch("app.api.v1.bulk.bulk_insert", side_effect=Exception) response = client.post( "/v1/bulk", json={ "items": [ { "title": "title", "uri": "uri", "date": "2021-01-01", } ] }, ) assert response.status_code == 500 assert response.json == {"ok": False}
额外提醒
- 记住规则:patch的是被调用代码所在模块中导入的目标对象,而非原对象的定义路径。
- 接口里的
except:捕获所有异常,建议改成捕获特定异常类型,避免隐藏其他潜在问题。
内容的提问来源于stack exchange,提问作者Rodrigo
相关产品推荐
相关产品推荐

