Мокка 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);
})
//...