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

Codeception中seeResponseIsValidOnJsonSchema()无法使用JSON Schema外部$ref

Codeception中JSON Schema外部$ref引用失效的解决办法

在Codeception里用seeResponseIsValidOnJsonSchema()验证接口响应时,依赖的JSON Schema for PHP库经常会出现外部$ref引用失效的情况,抛出错误:

[JsonSchema\Exception\ResourceNotFoundException] file_get_contents(file:///Schemas/Response/ResponseError.json): Failed to open stream: No such file or directory

下面是几个可行的解决方向:

1. 手动配置Schema解析器的基础路径

JSON Schema for PHP的默认路径解析逻辑可能和Codeception的测试上下文不匹配,你可以手动指定Schema文件的根路径,让解析器能正确找到引用的文件:

use JsonSchema\SchemaStorage;
use JsonSchema\Validator;
use JsonSchema\RefResolver;

// 指向你的Schema文件所在的绝对路径
$schemaRoot = realpath(__DIR__ . '/../Support/Schemas');
$schemaStorage = new SchemaStorage();
// 初始化解析器时绑定基础路径
$refResolver = new RefResolver($schemaStorage, "file://{$schemaRoot}/");

// 加载主Schema并解析所有$ref
$mainSchema = json_decode(file_get_contents($schemaRoot . '/Manage/Users.json'));
$refResolver->resolve($mainSchema);

// 用解析后的完整Schema做验证
$I->seeResponseIsValidOnJsonSchema($mainSchema);

2. 改用相对路径的$ref引用

把$ref改成相对于主Schema文件的路径,不要用绝对路径或类URL格式。比如主Schema在tests/Support/Schemas/Manage/Users.json,要引用的ResponseError.json在tests/Support/Schemas/Response/,那么$ref应该写成:

"$ref": "../Response/ResponseError.json"

同时确认Codeception的测试执行目录是项目根目录,或者在codeception.yml里设置正确的root参数。

3. 临时合并Schema为单个文件

如果上面的方法都没效果,可以先把所有带$ref的Schema内容手动合并成一个JSON文件,直接传入seeResponseIsValidOnJsonSchema()。虽然比较繁琐,但能快速完成验证需求,之后再优化解析配置。

内容的提问来源于stack exchange,提问作者Michał Żurakowski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 07:40:58