Мокка Supertest json response body pattern matching issue

Когда я делаю вызов 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": "[email protected]",
          "registered": /./,
          "first_name": "",
          "last_name": ""
        })
        .end(function(err, res) {
          if (err) return done(err);
          done();
        });
      });
    });
  });

Вот изображение вывода:

enter image description here

Любые идеи по использованию регулярного выражения для шаблона, соответствующего ответу тела json?

Ответ 1

Я задал этот вопрос на ранней стадии своего понимания структуры. Для всех, кто спотыкается об этом, я рекомендую использовать chai для утверждения. Это помогло использовать регулярное выражение для сопоставления шаблонов гораздо более простым способом.

Вот пример:

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

Ответ 2

В ваших тестах есть две вещи: ваша схема JSON и фактические возвращаемые значения. Если вы действительно ищете "соответствие шаблонов" для проверки своего формата JSON, может быть, это хорошая идея взглянуть на схему Chai chai-json (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 поддерживает регулярные выражения.

Ответ 3

Я написал lodash-match-pattern, и это обложка Chai chai-match-pattern для обработки подобных утверждений. Он может обрабатывать то, что вы описали с помощью регулярных выражений:

chai.expect(response.body).to.matchPattern({
  id: /\d{10}/,
  email: "[email protected]",
  registered: /./,
  first_name: "",
  last_name: ""
});

или использовать любой из многих включенных сокетов и потенциально игнорировать поля, которые не имеют значения.

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

Ответ 4

Я думаю, что chai использует чрезмерный синтаксис.

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