2013-07-23 4 views
12

Wenn ich einen API-Aufruf mache, möchte ich das zurückgegebene JSON für seine Ergebnisse überprüfen. Ich kann den Körper sehen und einige der statischen Daten werden korrekt überprüft, aber wo immer ich regulären Ausdruck verwende, sind die Dinge kaputt. Hier ist ein Beispiel von meinem Test:Mocha Supertest JSON Antwort Körpermuster passendes Problem

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(); 
     }); 
     }); 
    }); 
    }); 

Hier wird ein Bild des Ausgangs:

enter image description here

Irgendwelche Ideen zur Verwendung von regulären Ausdrücken für Muster Anpassung der json Körperreaktion?

+2

Warum nicht Sie die Felder, die Sie wollen, greifen keine Rolle zu checken Sie den Callback ein ('var id = req.body.id') und führen Sie Ihre regulären Ausdrucksprüfungen mit einer Assertion Library durch? –

+1

Überprüfung pro Feld ist auch lesbarer. –

Antwort

5

Ich habe diese Frage früh in meinem Verständnis des Rahmens gestellt. Für jeden, der darüber stolpert, empfehle ich Chai zur Behauptung. Auf diese Weise konnte der reguläre Ausdruck für die Mustererkennung wesentlich sauberer verwendet werden. Hier

ein Beispiel:

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

Ich denke, chai übermäßige Syntax verwendet.

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

Es gibt zwei Dinge, die Sie in Ihren Tests betrachten können: Ihr JSON-Schema und die tatsächlichen zurückgegebenen Werte. Falls Sie wirklich nach einem "Mustervergleich" suchen, um Ihr JSON-Format zu validieren, ist es vielleicht eine gute Idee, sich Chais Chai-Json-Schema anzuschauen (http://chaijs.com/plugins/chai-json-schema/).

Es unterstützt JSON Schema v4 (http://json-schema.org), mit dem Sie Ihr JSON-Format auf engere und lesbarere Weise beschreiben können.

in dieser speziellen Fall der Frage, könnten Sie ein Schema wie folgt verwenden:

{ 
    "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" } 
    } 

} 

Und dann:

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

Und als Bonus: das JSON Schema reguläre Ausdrücke unterstützt.

2

Ich schrieb lodash-match-pattern und es ist Chai Wrapper chai-match-pattern, um nur diese Arten von Behauptungen zu behandeln. Es kann handhaben, was Sie mit regulären Ausdrücken beschrieben:

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

oder verwenden Sie eine viele Matcher enthalten und möglicherweise Felder ignorieren, die nicht

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