经过长时间的搜索,我终于发现swagger-test是从swagger规范测试我的REST服务的最佳框架。我跟着读了我和回购中的例子。这是我的第一个xamples
请求/响应对。
"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"
}
}}]
{p> app_id
和table_name
在url
中被很好地替换。
body
永远不会包含在http请求中。我知道这是因为我检查过wireshark的流量
我很确定我的规格非常好,因为我已经从Swagger-UI手动运行了成功的测试。这是我的控制台的屏幕截图:
这意味着我的请求未经授权,因为上面的请求key
中缺少body
参数。
这是我的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
?
答案 0 :(得分:2)
经过几个小时的抓取网络并且没有解决方案,我试图浏览代码和使用的模块。这就是我发现解决了我的问题:
我的x-amples
JSON格式错误,特别是在放置body
元素的地方。
从我的问题
app_id
和table_name
在网址中被很好地替换。
那是因为这一行:
var xamples = swaggerTest.parse(swaggerSpec);
来自test file
。
swagger-test的主要功能是解析Swagger规范文件并将所有x-ample
元素提取到数组中,如下所示:
var xamples = swaggerTest.parse(swaggerSpec);
这意味着swagger-test完美地完成了它的工作,即:
x-ample
扩展名检索到数组中。替换params
元素中的值:
"request": {
"params": {
"app_id": "bengi",
"table_name": "Student",
"body": {
"collectionName": "Student",
"key": "mLiJB380x9893rjlaf0"
}
}
}
进入url
模板:
e取代; /数据/ {APP_ID} / {表名}
从host
和basePath
JSON连接params
,swagger-spec
和request
以形成完整的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
,它是从我的测试代码传递给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
元素,否则会出错。