使用 npm 安装:
npm i mock-pb-cli@latest -g
可以使用下面命令查看帮助:
$ mock-pb -h Usage: mock-protobuf [options] [command] A tool to mock protobuf Options: -v, --version output the version number -h, --help display help for command Commands: s|serve [options] Create a mock server for the given protobuf g|generate [options] Generate mock data for the given protobuf help [command] display help for command
有两个子命令:
mock-pb g
或 mock-pb generate
:Mock JSON 数据;mock-pb s
or mock-pb serve
:Mock 服务;Generate 子命令主要是用来生成 Mock 的 JSON 数据;
例如:
$ mock-pb g
上面的命令会获取当前工作目录下所有的 Proto 文件,并且将 Mock 的数据输出到终端;
例如:
Mocked demo.BasicResponse: { "status": 902735693509892, "message": "Vmucue hqxllqx oiloapzwp.", "resp": {} } Mocked demo.DemoRequest: { "data": "Kqr gxxq." } Mocked demo.DemoResponse: { "resp": { "status": -6061376970430480, "message": "Xpjzjyxrcq eqkmytjo.", "resp": {} }, "resp_data": "Ryogd tswayqjsf." }
默认情况下的 Protobuf 文件搜索路线为 .
,你也可以使用 -d
来指定路径!
例如:
$ mock-pb g -d ../test/proto
同时,默认情况下 Mock 数据会打印到终端,你也可以使用 -o
来指定将 Mock 的数据输出到指定的目录!
例如:
$ mock-pb g -o ./mock-pb-output
此时,mock-pb-output
目录下的结果为:
$ tree . ├── demo │ ├── BasicResponse.json │ ├── DemoRequest.json │ └── DemoResponse.json ├── google.api │ ├── CustomHttpPattern.json │ ├── HttpBody.json │ ├── Http.json │ └── HttpRule.json └── google.protobuf ├── Any.json ├── Api.json ...... ├── SourceContext.json ├── Type.json └── UninterpretedOption.json
输出中的目录结构是根据 Proto 文件中的 package
来产生的!
除了产生 Mock 的数据,也可以直接 Mock 服务接口;
下面的命令会读取当前工作目录下的 Proto 文件,并 Mock 在 Service 中定义了的 Method:
$ mock-pb s
输出如下:
Handling routePath: /Demo Handling routePath: /demo/DemoServiceAnotherDemo restify listening at http://[::]:3333
在服务端启动时,会打印出每个接口的请求路径;
默认情况下的服务端口号为:
3333
,你可以使用-p
来自定义端口;例如:
mock-pb s -p 13333
如果你在你的 Method 中通过 google.api.http
定义了请求路径,那么在 Mock 服务的时候会使用这个路径;
例如:
service DemoService { rpc Demo(DemoRequest) returns (DemoResponse) { option (google.api.http) = { post: "/Demo" body: "*" }; } }
如果没有指定请求路径,那么请求路径为:/{ProtobufPackageName}/{ProtobufMethodName}
;
例如:
syntax = "proto3"; package demo; service DemoService { rpc AnotherDemo(AnotherDemoRequest) returns (AnotherDemoResponse) {} }
当服务启动后的请求路径为:
$ curl localhost:3333/demo/DemoServiceAnotherDemo {"resp":{"status":-843357854531144,"message":"Vzby.","resp":{}},"resp_data":"Kvia gfkcggmuo."}
有时候你可能并不想 Mock 一些像下面这些无意义的数据:
{"resp":{"status":-843357854531144,"message":"Vzby.","resp":{}},"resp_data":"Kvia gfkcggmuo."}
而是想要自定义一些有用的返回值,比如:
{"resp":{"status":200,"message":"ok"},"resp_data":{"Message":"This is a demo message"}}
此时可以创建配置文件,例如:
mock-protobuf.config.json
{ "ResponseValue": [ { "MethodName": "demo.Demo", "Data": { "Hello": "world" } }, { "MethodName": "demo.AnotherDemo", "Data": { "resp": { "status": 200, "message": "ok" }, "resp_data": { "Message": "This is a demo message" } } } ] }
其中 MethodName
是 Proto 文件中 Method 的全名:package.method
;
同时,你也可以通过 -c
请求来指定你的配置文件路径,例如: -c ./mock-protobuf.config.json
;
下面是一个完整的命令行例子:
$ npm run dev -- s -i demo -c ./mock-protobuf.config-demo.json
使用自定义返回值后的响应如下:
$ curl localhost:3333/Demo {"Hello":"world"} $ curl localhost:3333/demo/DemoServiceAnotherDemo {"resp":{"status":200,"message":"ok"},"resp_data":{"Message":"This is a demo message"}}
有的时候我们并不想 Mock 所有的 Proto 定义,此时可以使用 Filter 过滤条件;
有两种方式进行过滤:
-i <string>
或 --include
;-e <string>
或 --exclude
;上面的 <string>
被定义为一个 JS 中的正则表达式 RegExp
,所以可以使用类似于正则表达式的方式对 Proto 定义进行匹配:packageName.serviceName.methodName
;
多个条件使用
,
分隔!
当使用 Include 过滤条件,只有匹配的 Proto 定义才会被 Mock ;
例如:
$ mock-pb g -i demo Mocked demo.BasicResponse: { "status": -978663427598816, "message": "Iymo zomttydmb.", "resp": {} } Mocked demo.DemoRequest: { "data": "Mdnbfxbvoq khrbwyu sxmkev jss." } Mocked demo.DemoResponse: { "resp": { "status": 6207610394471496, "message": "Dkwse mmhmuhhunb.", "resp": {} }, "resp_data": "Fqwkd noiefpr ntjbcfydl." } Mocked demo.AnotherDemoRequest: { "name": "Puvujqy kyxl hshuysly.", "age": 175838119803604 } Mocked demo.AnotherDemoResponse: { "resp": { "status": -7659482750118844, "message": "Fygec kyzysqqga svimupy nbfrjt.", "resp": {} }, "resp_data": "Mpgjtjsbr qfspgkb xmpji." }
上面的命令只会为 demo.*
产生 Mock 数据(即:package 为 demo 的那些定义)!
另外一个例子:
$ mock-pb g -i demo.DemoRequest.* Mocked demo.DemoRequest: { "data": "Ewqzspj hjkfvvc froqdhkwe fkqsdg dytidwli." }
此时只会 Mock:demo.DemoRequest
这一个 Message !
相反的,-e
产生将会排除那些匹配的 Message ;
例如:
$ mock-pb g -e demo.*,google.protobuf.* -o mock-pb-gen $ tree . └── google.api ├── CustomHttpPattern.json ├── HttpBody.json ├── Http.json └── HttpRule.json
上面的命令将不会 Mock demo.*
和 google.protobuf.*
下的 Message !
<font color="#f00">注意:当你同时使用 include
and exclude
两个过滤器,exclude
会永远首先生效!</font>
例如:
code class="language-bash">$ mock-pb g -i demo -e demo
什么都不会输出,因为所有的内容都被过滤掉了!
关于整个开发的过程以及思路,我也放到了我的博客:
希望对 TypeScript 初学者,以及想使用 TypeScript 编写 CLI 小工具的小伙伴们有帮助!