У меня есть тест 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;
}
};
Благодарим за подробный ответ! Я внес изменения, которые вы рекомендовали, но даже после этого заголовки все еще не пройдены. Любые другие идеи? Я хочу, чтобы документация frisbyjs была такой же подробной, как и ваш ответ. – voxoid
Да, документация Frisby.js далека от совершенства. Раньше это была моя playtoy, но я отказался от нее некоторое время назад - я думаю, в основном потому, что она основана на жасмин-узле, который до сих пор не использует Jasmine 2.0 (он находится в бета-версии) - и переключился на использование SuperTest: https: // github.com/visionmedia/supertest. О вашем случае - я боюсь, что у меня нет идей, только я могу предложить исключить опцию 'json: true' для' .get() 'запросов. Я вижу, что этот вариант ломает их здесь (ошибки на стороне Фрисби). Также не забудьте передать объект options как * второй * аргумент '.get()' calls, а * third * - '.post()'. Удачи! – bardzusny
Еще раз спасибо бардзусный! frisbyjs ест больше времени, чем мне стоило, поэтому я переключился на простой жасминовый узел и запрос, и обнаружил, что не пропущу лишних фрисби. Но supertest выглядит красиво, менее многословно, чем простой jasmine-node/request. – voxoid