2015-05-16 4 views
1

У меня есть тест frisbyjs внутри другого теста frisbyjs afterJSON(), который терпит неудачу. Когда я отлаживаю код сервера, кажется, что HTTP-заголовки х-доступа-токена и х-ключа не отправляются. Я посылаю их неправильно? Конечно, я делаю что-то глупое.тест frisbyjs терпит неудачу, потому что get() не отправляет HTTP-заголовки

Ниже приведено наружное испытание. Первый тест в afterJSON() является тот, который не удается:

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() приводит к:

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

А вот код сервера (экспресс промежуточного) обработки запроса, где маркер и ключ и в конечном итоге «неопределенный» при отладке, и res.headers не содержит й-доступ лексем, ни х ключа заголовков:

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

Обратите внимание, как мы передаем одиночные варианты возражают .get() вместо три отдельных из них (для json и headers и один пустой в начале).

Также: если большинство ваших запросов будут содержать эти заголовки, может быть полезно установить их по всему миру. Это относится и к другим вариантам:

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. О вашем случае - я боюсь, что у меня нет идей, только я могу предложить исключить опцию 'json: true' для' .get() 'запросов. Я вижу, что этот вариант ломает их здесь (ошибки на стороне Фрисби). Также не забудьте передать объект options как * второй * аргумент '.get()' calls, а * third * - '.post()'. Удачи! – bardzusny

+0

Еще раз спасибо бардзусный! frisbyjs ест больше времени, чем мне стоило, поэтому я переключился на простой жасминовый узел и запрос, и обнаружил, что не пропущу лишних фрисби. Но supertest выглядит красиво, менее многословно, чем простой jasmine-node/request. – voxoid

 Смежные вопросы

  • Нет связанных вопросов^_^