2013-07-23 7 views
12

जब मैं एक एपीआई कॉल करता हूं तो मैं इसके परिणामों के लिए लौटा 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 शरीर प्रतिक्रिया मिलान पैटर्न के लिए रेगुलर एक्सप्रेशन के उपयोग पर कोई भी विचार यहाँ मेरी परीक्षण का एक उदाहरण है?

+2

आप क्षेत्रों आप करना चाहते हैं क्यों आकर्षित नहीं कर पाते उपेक्षा का उपयोग: यह क्या आप नियमित अभिव्यक्ति के साथ वर्णित संभाल कर सकते हैं कॉलबैक में चेक करें ('var id = req.body.id') और एक सम्मिलन लाइब्रेरी के साथ अपनी नियमित अभिव्यक्ति जांच चलाएं? –

+1

प्रति फ़ील्ड की जांच भी अधिक पठनीय है। –

उत्तर

5

मैंने ढांचे की मेरी समझ में जल्दी ही इस प्रश्न से पूछा। किसी और के लिए जो इस पर ठोकर खाती है, मैं सलाह के लिए चाई का उपयोग करने की सलाह देता हूं। इसने एक बहुत साफ तरीके से मिलान पैटर्न के लिए नियमित अभिव्यक्ति का उपयोग करने में मदद की।

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

मैं चाय अत्यधिक सिंटैक्स का उपयोग करता लगता है:

यहाँ एक उदाहरण है। आपके JSON स्कीमा और वास्तविक लौटे मान:

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

दो चीजें आप अपने परीक्षण में विचार कर सकते हैं कर रहे हैं। यदि आप वास्तव में अपने 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 स्कीमा नियमित अभिव्यक्ति का समर्थन करता है।

2

मैंने lodash-match-pattern लिखा और यह चाई रैपर chai-match-pattern है जो इस तरह के दावों को संभालने के लिए है।

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

या कई में से किसी matchers शामिल है और संभावित क्षेत्रों है कि कोई फर्क नहीं पड़ता

chai.expect(response.body).to.matchPattern({ 
    id: "_.isInRange|1000000000|9999999999", 
    email: _.isEmail, 
    registered: _.isDateString, 
    "...": "" 
}); 
संबंधित मुद्दे