没有请求身体在招摇testing
经过漫长的search之后,我终于发现swagger-test是从swagger spec中testing我的REST服务的最佳框架。 我跟着读了我和回购的例子。 这是我的第一个请求/响应对。
"x-amples": [{ "description": "should save an object", "request": { "params": { "app_id": "bengi", "table_name": "Student", "body": { "collectionName": "Student", "key": "mLiJB380x9893rjlaf0" } } }, "response": { "status": 200, "headers": { "content-type": "application/json" } }}]
app_id
和table_name
在url
中被很好地替代。
我的问题是参数body
永远不会包含在http请求中。 我知道这是因为我检查了wireshark的stream量。
我很确定我的规格非常好,因为我已经从Swagger-UI手动运行成功的testing。 这里是我的控制台的屏幕截图:
这意味着我的请求是未经授权的,因为缺less上面请求body
中的key
参数。
这是我的mocha调用的js.js文件:
var swaggerTest = require('swagger-test'); var fs = require('fs'); var preq = require('preq'); var swaggerSpec; var buffer = fs.readFileSync('cb.json'); swaggerSpec = JSON.parse(buffer); var xamples = swaggerTest.parse(swaggerSpec); describe('specification-driven tests', function () { xamples.forEach(function (xample) { it(xample.description, function() { this.timeout(10000); return preq[xample.request.method](xample.request) .then(function (response) { assert.deepEqual(response, xample.response); }); }); }); });
我应该做些什么来确保我的请求body
被大量swagger-test
看到和使用?
经过几个小时的networking爬行,没有解决办法,我试图通过代码和使用的模块。 这是我发现解决了我的问题:
我的x-amples
JSON格式错误,特别是放置了我的body
元素的地方。
从我的问题
app_id
和table_name
在url中被很好地替代。
那是因为这一行:
var xamples = swaggerTest.parse(swaggerSpec);
从test file
。
swagger-test的主要function是parsingSwagger规范文件,并将所有x-ample
元素提取到数组中,如下所示:
var xamples = swaggerTest.parse(swaggerSpec);
这意味着大举的testing完成它的工作,即:
- 检索所有的
x-ample
exples到数组中。 -
replace
params
元素中的值:"request": { "params": { "app_id": "bengi", "table_name": "Student", "body": { "collectionName": "Student", "key": "mLiJB380x9893rjlaf0" } } }
进入
url
模板:
E> /数据/ {APP_ID} / {} TABLE_NAME
-
从
swagger-spec
连接host
,basePath
和params
并request
JSON以形成一个完整的uri
。
所有这一切都是在这个驴子工作的代码片段中完成的function parseXample(spec, uri, method, xample) { var uriTemplate = template.parse(uri); var expandedUri = uriTemplate.expand(xample.request.params); xample.request.method = method; xample.request.uri = spec.host + spec.basePath + expandedUri; return { description: xample.description || method + ' ' + uri, request: xample.request, response: xample.response };
}
从我的问题:
我的问题是参数正文永远不会包含在http请求中
技巧是在getOptions([url],[o],[method])
方法中的preq模块源代码中。
if (o.body && o.body instanceof Object) { if (o.headers && /^application\/json/.test(o.headers['content- type'])) { o.body = JSON.stringify(o.body); } else if (o.method === 'post') { o.form = o.body; o.body = undefined; } }
参数o
是options
,它是从我的testing代码传递给preq的xample.request
对象:return preqxample.request.method所以很明显xample.request.body
在请求对象中是存在的,因为它在xample.request.params.body
因此if (o.body && o.body instanceof Object)
不通过,并且因此赋值o.body=JSON.stringify(o.body)
没有发生,条件也是如此。
最后的x-ample
扩展应该看起来像这样:
"x-amples": [{ "description": "should save an object", "request": { "method": "put", "uri": "/data/{app_id}/{table_name}", "headers": { "content-type": "application/json" }, "body": { "collectionName": "Student", "key": "xxxxxx" }, "params": { "app_id": "xxxxxx", "table_name": "xxxxxx" } }, "response": { "status": 200, "headers": { "content-type": "application/json" } } }]
除了body
元素的位置,你必须包含headers
元素,否则你会得到一个错误。