ybelenko / openapi-data-mocker
从Swagger 2.0|Openapi 3.0规范生成假数据的库
1.1.0
2021-08-05 11:10 UTC
Requires
- php: ^7.3 || ^8.0
- ybelenko/openapi-data-mocker-interfaces: ^1.0
Requires (Dev)
- phpunit/phpunit: ^8.0 || ^9.0
- squizlabs/php_codesniffer: ^3.5
This package is auto-updated.
Last update: 2024-09-22 01:28:52 UTC
README
Openapi Data Mocker帮助从OpenAPI 3.0文档生成假数据。大部分方法可能与2.0版本(即Swagger 2.0)兼容,但未经测试。这个包是OpenAPI Generator项目(在OpenAPI Generator)中PHP Slim4服务器的增强,但更容易在单独的存储库中维护。
要求
- PHP ^7.3
重要提示!虽然composer.json中声明了PHP 8.0,但此包尚未针对它进行测试。
通过Composer安装
在终端运行
composer require ybelenko/openapi-data-mocker
用法示例
假设我们有一个如下的OpenAPI规范3.0.3 - 模式对象
description: Real world example schema type: object properties: id: type: integer format: int32 minimum: 1 purchased_items: type: array items: type: object properties: SKU: type: string format: uuid maxLength: 20 quantity: type: integer format: int32 minimum: 1 maximum: 5 price: type: object properties: currency: type: string minLength: 3 maxLength: 3 enum: - USD - EUR - RUB value: type: number format: float minimum: 0.01 maximum: 99.99 manufacturer: type: object properties: name: type: string maxLength: 30 country: type: string enum: - CHN - USA - RUS buyer: type: object properties: first_name: type: string minLength: 3 maxLength: 15 last_name: type: string minLength: 3 maxLength: 15 credit_card: type: integer minimum: 1000000000000000 maximum: 10000000000000000 phone: type: integer minimum: 10000000000000 maximum: 99999999999999 email: type: string format: email status: type: string enum: - registered - paid - shipped - delivered default: registered created_at: type: string format: date-time
注意!虽然模式对象以YAML格式呈现,但这个库目前不支持YAML或JSON解析。这意味着
mockSchemaObject
方法期望传入已解码的JSON值作为参数。
当我们使用mockSchemaObject
方法模拟上述模式时
require __DIR__ . '/vendor/autoload.php'; use OpenAPIServer\Mock\OpenApiDataMocker as Mocker; $mocker = new Mocker(); // set model classes namespace for $ref handling // current example doesn't use $refs in schemas, however $mocker->setModelsNamespace('JohnDoesPackage\\Model\\'); // class InvoiceTest contains schema mentioned previously // it returns that schema with getOpenApiSchema() method declared in OpenAPIServer\Mock\BaseModel parent class $schema = \OpenAPIServer\Mock\Model\InvoiceTest::getOpenApiSchema(); $data = $mocker->mockSchemaObject($schema); echo json_encode($data, \JSON_PRETTY_PRINT);
输出如下
{ "id": 1912777939, "purchased_items": [ { "SKU": "5ee78cfde9f05", "quantity": 4, "price": { "currency": "EUR", "value": 57.635 }, "manufacturer": { "name": "Lorem i", "country": "USA" } } ], "buyer": { "first_name": "Lorem ipsum do", "last_name": "Lorem ipsum ", "credit_card": 2455087473915908, "phone": 65526260517693, "email": "jfkennedy@example.com" }, "status": "delivered", "created_at": "1978-08-08T04:03:09+00:00" }
当然,每次调用输出的内容都会略有不同。这正是mocker包被开发出来的原因。
您可以在examples/extended_example.php中查看扩展示例。
支持的功能
除了特定的字符串格式(例如email
、uuid
、password
,这些格式实现得不好)之外,支持所有数据类型。
数据类型支持
数据选项支持
已知限制
避免在模式中循环引用。下面的模式会导致无限循环和Out of Memory
PHP错误
# ModelA has reference to ModelB while ModelB has reference to ModelA. # Mock server will produce huge nested JSON example and ended with `Out of Memory` error. definitions: ModelA: type: object properties: model_b: $ref: '#/definitions/ModelB' ModelB: type: array items: $ref: '#/definitions/ModelA'
不要引用标量类型,因为生成器不会产生模拟服务器可以找到的模型。所以下面的模式会导致错误
# generated build contains only `OuterComposite` model class which referenced to not existed `OuterNumber`, `OuterString`, `OuterBoolean` classes # mock server cannot mock `OuterComposite` model and throws exception definitions: OuterComposite: type: object properties: my_number: $ref: '#/definitions/OuterNumber' my_string: $ref: '#/definitions/OuterString' my_boolean: $ref: '#/definitions/OuterBoolean' OuterNumber: type: number OuterString: type: string OuterBoolean: type: boolean