swagger-test中没有请求体

时间:2016-02-16 16:13:55

标签: node.js mocha swagger

经过长时间的搜索,我终于发现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_idtable_nameurl中被很好地替换。
我的问题是参数body永远不会包含在http请求中。我知道这是因为我检查过wireshark的流量 我很确定我的规格非常好,因为我已经从Swagger-UI手动运行了成功的测试。这是我的控制台的屏幕截图: when I run the tests


这意味着我的请求未经授权,因为上面的请求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

1 个答案:

答案 0 :(得分:2)

经过几个小时的抓取网络并且没有解决方案,我试图浏览代码和使用的模块。这就是我发现解决了我的问题:
我的x-amples JSON格式错误,特别是在放置body元素的地方。
从我的问题

  

app_idtable_name在网址中被很好地替换。

那是因为这一行:

 var xamples = swaggerTest.parse(swaggerSpec);

来自test file


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

var xamples = swaggerTest.parse(swaggerSpec);

这意味着swagger-test完美地完成了它的工作,即:

  1. 将所有x-ample扩展名检索到数组中。
  2. 替换params元素中的值:

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

    进入url模板:

  3. e取代; /数据/ {APP_ID} / {表名}

    1. hostbasePath JSON连接paramsswagger-specrequest以形成完整的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
      };
      

      }


    2. 从我的问题:

        

      我的问题是参数主体永远不会包含在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,它是从我的测试代码传递给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元素,否则会出错。