Mocha Supertest json响应身体模式匹配问题

时间:2013-07-23 23:01:49

标签: regex json api mocha supertest

当我进行API调用时,我想检查返回的JSON的结果。我可以看到正文和一些静态数据正在被正确检查,但无论我在哪里使用正则表达式都会被破坏。以下是我的测试示例:

describe('get user', function() {

    it('should return 204 with expected JSON', function(done) {
      oauth.passwordToken({
        'username': config.username,
        'password': config.password,
        'client_id': config.client_id,
        'client_secret': config.client_secret,
        'grant_type': 'password'
      }, function(body) {
        request(config.api_endpoint)
        .get('/users/me')
        .set('authorization', 'Bearer ' + body.access_token)
        .expect(200)
        .expect({
          "id": /\d{10}/,
          "email": "qa_test+apitest@example.com",
          "registered": /./,
          "first_name": "",
          "last_name": ""
        })
        .end(function(err, res) {
          if (err) return done(err);
          done();
        });
      });
    });
  });

以下是输出图片:

enter image description here

有关使用正则表达式匹配json body响应的模式的想法吗?

4 个答案:

答案 0 :(得分:5)

我在理解框架的早期就问了这个问题。对于任何偶然发现此问题的人,我建议使用chai进行断言。这有助于以更清晰的方式使用正则表达式进行模式匹配。

以下是一个例子:

res.body.should.have.property('id').and.to.be.a('number').and.to.match(/^[1-9]\d{8,}$/);

答案 1 :(得分:4)

您可以在测试中考虑两件事:JSON模式和实际返回值。如果你真的在寻找"模式匹配"要验证您的JSON格式,或许查看Chai的chai-json-schema(http://chaijs.com/plugins/chai-json-schema/)是个好主意。

它支持JSON Schema v4(http://json-schema.org),它可以帮助您以更加紧凑和可读的方式描述JSON格式。

在这个问题的具体案例中,您可以使用如下模式:

{
    "type": "object",
    "required": ["id", "email", "registered", "first_name", "last_name"]
    "items": {
        "id": { "type": "integer" },
        "email": { 
            "type": "string",
            "pattern": "email"
        },
        "registered": { 
            "type": "string",
            "pattern": "date-time"
        },
        "first_name": { "type": "string" },
        "last_name": { "type": "string" }
    }

}

然后:

expect(response.body).to.be.jsonSchema({...});

作为奖励: JSON Schema支持正则表达式

答案 2 :(得分:2)

我写了lodash-match-pattern并且它是Chai包装器chai-match-pattern来处理这些类型的断言。它可以处理你用正则表达式描述的内容:

chai.expect(response.body).to.matchPattern({
  id: /\d{10}/,
  email: "qa_test+apitest@example.com",
  registered: /./,
  first_name: "",
  last_name: ""
});

或使用许多包含的匹配器中的任何一个,并可能忽略无关紧要的字段

chai.expect(response.body).to.matchPattern({
  id: "_.isInRange|1000000000|9999999999",
  email: _.isEmail,
  registered: _.isDateString,
  "...": ""
});

答案 3 :(得分:1)

我认为柴使用过多的语法。

var assert = require('assert');
        //...
        .expect(200)
        .expect(function(res) {
            assert(~~res.body.id);
        })
        //...