Codeception中seeResponseIsValidOnJsonSchema()无法使用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

