2015-05-16 84 views
1

我有一個frisbyjs測試在另一個frisbyjs測試的afterJSON()失敗。當我調試服務器代碼時,看起來x-access-token和x-key HTTP頭沒有發送。我發錯了嗎?我當然在做一些愚蠢的事情。frisbyjs測試失敗,因爲get()沒有發送HTTP標頭

以下是外部測試。在afterJSON()第一個測試是失敗的一個:處理請求,其中

{ status: 401, message: 'Invalid Token or Key' } 

這裏是服務器代碼(特急中間件):

frisby.create('Should be able to log in with test user') 
.post(appHost + '/login', 
    { 
     username:'[email protected]', 
     password:'pass123' 
    }, 
    {json: true}, 
    {headers: {'Content-Type': 'application/json'}}) 
.expectStatus(200) 
.expectJSONTypes({ token: String }) 
.expectJSON({ 
    user: { 
     name:'test', 
     role:'admin', 
     username:'[email protected]' 
    } 
}) 
.afterJSON(function(res) { 
    // TODO: The functionality works, but this test does not; the headers do not get sent. 
    console.log('x-access-token: ' + res.token); 
    console.log('x-key: ' + res.user.username); 

    // **************** THIS IS THE TEST THAT FAILS ******************** 
    frisby.create('Should allow access with valid token') 
     .get(appHost + '/api/v1/products',{}, 
      {json:true}, 
      {headers:{ 
       'x-access-token': res.token, 
       'x-key': res.user.username 
      }}) 
     .inspectJSON() 
     .expectStatus(200) 
     .toss(); 

    frisby.create('Should not allow access with invalid token') 
     .get(appHost + '/api/v1/products',{}, 
     {json:true}, 
     {headers:{ 
      'x-access-token': res.token + '123', 
      'x-key': res.user.username 
     }}) 
     .expectStatus(401) 
     .toss(); 
}) 
.toss(); 

的inspectJSON()的結果令牌和密鑰都結束了「不確定」,而調試和res.headers不包含X-訪問令牌,也不X-KEY頭:

var jwt = require('jwt-simple'); 
var validateUser = require('../routes/auth').validateUser; 

module.exports = function(req, res, next) { 

    // When performing a cross domain request, you will recieve 
    // a preflighted request first. This is to check if our the app 
    // is safe. 

    // We skip the token outh for [OPTIONS] requests. 
    //if(req.method == 'OPTIONS') next(); 

    var token = (req.body && req.body.access_token) || (req.query && req.query.access_token) || req.headers['x-access-token']; 
    var key = (req.body && req.body.x_key) || (req.query && req.query.x_key) || req.headers['x-key']; 

    if (token || key) { 
    try { 
     var decoded = jwt.decode(token, require('../config/secret.js')()); 

     if (decoded.exp <= Date.now()) { 
     res.status(400); 
     res.json({ 
      "status": 400, 
      "message": "Token Expired" 
     }); 
     return; 
     } 

     // Authorize the user to see if s/he can access our resources 

     var dbUser = validateUser(key); // The key would be the logged in user's username 
     if (dbUser) { 


     if ((req.url.indexOf('admin') >= 0 && dbUser.role == 'admin') || (req.url.indexOf('admin') < 0 && req.url.indexOf('/api/v1/') >= 0)) { 
      next(); // To move to next middleware 
     } else { 
      res.status(403); 
      res.json({ 
      "status": 403, 
      "message": "Not Authorized" 
      }); 
      return; 
     } 
     } else { 
     // No user with this name exists, respond back with a 401 
     res.status(401); 
     res.json({ 
      "status": 401, 
      "message": "Invalid User" 
     }); 
     return; 
     } 

    } catch (err) { 
     res.status(500); 
     res.json({ 
     "status": 500, 
     "message": "Oops something went wrong", 
     "error": err 
     }); 
    } 
    } else { 
    res.status(401); 
    res.json({ 
     "status": 401, 
     "message": "Invalid Token or Key" 
    }); 
    return; 
    } 
}; 

回答

1

是的,它的東西很簡單 - 「幾乎是一個錯字」。這裏的工作代碼:

frisby.create('Should allow access with valid token') 
    .get(appHost + '/api/v1/products', { 
    json: true, 
    headers: { 
     'x-access-token': res.token, 
     'x-key': res.user.username 
    } 
    }) 
    .inspectJSON() 
    .expectStatus(200) 
    .toss(); 

注意我們如何通過單一的選擇對象,而不是獨立的人(爲jsonheaders,一個在一開始是空的),以.get()

另外:如果你的大多數請求將包含這些頭,它可能是設置它們在全球有用。這也適用於其他選項:

frisby.globalSetup({ 
    request: { 
    json: true, 
    headers: { 
     'x-access-token': res.token, 
     'x-key': res.user.username 
    } 
    } 
}); 

frisby.create('Should allow access with valid token') 
    .get(appHost + '/api/v1/products') //no need for options - they're already set! 
    .inspectJSON() 
    .expectStatus(200) 
    .toss(); 

frisby.create('Should not allow access with invalid token') 
    .get(appHost + '/api/v1/products', { 
    // ...but you still can override them - when needed 
    headers: { 
     'x-access-token': res.token + '123', 
     'x-key': res.user.username 
    } 
    }) 
    .expectStatus(401) 
    .toss(); 
+0

謝謝您的詳細回覆!我做了你推薦的更改,但即使在那之後,標題仍然沒有通過。任何其他想法?我希望frisbyjs的文檔和你的回覆一樣詳細。 – voxoid

+1

是的,Frisby.js文檔遠非完美。它曾經是我的playtoy,但我之前放棄了它 - 我猜主要是因爲它基於茉莉花節點,它仍然沒有使用Jasmine 2.0(它處於測試版) - 並切換到使用SuperTest:https:// github.com/visionmedia/supertest。關於你的情況 - 恐怕我沒有想法,我只能建議省略'.get()'請求的'json:true'選項。我看到這個選項在這裏被打破(Frisby方面的錯誤)。還要記住將選項對象作爲* second *參數傳遞給'.get()'調用,並將* third *傳遞給'.post()'。祝你好運! – bardzusny

+0

再次感謝bardzusny! frisbyjs是吃更多的時間比它值得我,所以我切換到使用普通的茉莉花節點和要求,發現我不會錯過任何額外frisbyjs可能會提供。但是supertest看起來不錯,比簡單的jasmine-node/request更簡潔。 – voxoid