2013-07-23 76 views
12

當我進行API調用時,我想檢查返回的JSON的結果。我可以看到正文和一些靜態數據正在被正確檢查,但是無論我在哪裏使用正則表達式,事情都被打破了。這是我的測試的示例:摩卡Supertest 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

我早在對框架的理解中就提出了這個問題。對於任何絆倒在這的人,我推薦使用chai來斷言。這有助於以更簡潔的方式使用正則表達式進行模式匹配。

下面是一個例子:

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

我覺得薛寶釵使用過多的語法。

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

有可能在測試中考慮兩件事情:你的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模式支持正則表達式

2

我寫了lodash-match-pattern,它是柴包裝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, 
    "...": "" 
});