没有请求身体在招摇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_idtable_nameurl中被很好地替代。
我的问题是参数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_idtable_name在url中被很好地替代。

那是因为这一行:

  var xamples = swaggerTest.parse(swaggerSpec); 

test file

swagger-test的主要function是parsingSwagger规范文件,并将所有x-ample元素提取到数组中,如下所示:

 var xamples = swaggerTest.parse(swaggerSpec); 

这意味着大举的testing完成它的工作,即:

  1. 检索所有的x-ample exples到数组中。
  2. replaceparams元素中的值:

     "request": { "params": { "app_id": "bengi", "table_name": "Student", "body": { "collectionName": "Student", "key": "mLiJB380x9893rjlaf0" } } } 

    进入url模板:

E> /数据/ {APP_ID} / {} TABLE_NAME

  1. swagger-spec连接hostbasePathparamsrequest 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; } } 

参数ooptions ,它是从我的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元素,否则你会得到一个错误。