NodeJs:接下来不是功能
我尝试使用Mocha,Chai和Supertest编写单元测试,但不幸的是,现在不成功。
我旁边路线:NodeJs:接下来不是功能
var express = require('express');
var GoogleUrl = require('google-url');
var _ = require('lodash');
var token = require('../middlewares/token');
var Url = require('../models/url');
var config = require('../config');
var router = express();
router.post('/urls/create', token.required, createShortUrl);
module.exports = router;
function createShortUrl(req, res) {
_.trim(req.body.list_tags);
var tags = _.split(req.body.list_tags, ',');
tags.splice(tags.length - 1, 1);
var date = returnDate();
var time = returnTime();
var googleUrl = new GoogleUrl({
'key': config.get('google_key')
});
googleUrl.shorten(req.body.full_url, function (err, shortUrl) {
if (err) {
res.status(500).json(err);
}
var url = new Url({
'author': req.payload.username,
'description': req.body.description,
'full_url': req.body.full_url,
'short_url': shortUrl,
'list_tags': tags,
'date': date,
'time': time
});
url.save(function (err) {
if (err) {
res.status(500).json(err);
} else {
res.status(200).json('Shortener url is created!');
}
});
});
}
function returnDate() {
var d = new Date();
var yyyy = d.getFullYear();
var mm = d.getMonth() < 9 ? '0' + (d.getMonth() + 1) : (d.getMonth() + 1);
var dd = d.getDate() < 10 ? '0' + d.getDate() : d.getDate();
return dd + '-' + mm + '-' + yyyy;
}
function returnTime() {
var d = new Date();
var hh = d.getHours() < 10 ? '0' + d.getHours() : d.getHours();
var min = d.getMinutes() < 10 ? '0' + d.getMinutes() : d.getMinutes();
var ss = d.getSeconds() < 10 ? '0' + d.getSeconds() : d.getSeconds();
return hh + ':' + min + ':' + ss;
}
我节省使用猫鼬在MongoDB中的数据。 对于路线我写的单元测试:
var app = require('../server');
var chai = require('chai');
var request = require('supertest');
var jwt = require('express-jwt');
var config = require('../config');
var expect = chai.expect;
describe('Urls Tests', function() {
var url = {
author : 'Alexey',
description : 'grrggr',
full_url : 'https://github.com',
short_url : 'short_url_by_google',
date : '30-06-2017',
time : '18:21:27',
count_click : 0,
list_tags : [
'Sport',
'Football'
]
};
var token = {
required: jwt({
secret: config.get('jwtSecret'),
userProperty: 'payload',
getToken: 'token',
})
};
describe('## Create url ', function() {
it('should create a url', token.required, function(done) {
request(app)
.post('/urls/create')
.send(url)
.end(function(err, res) {
expect(res.statusCode).to.equal(200);
expect(res.body.author).to.equal('Alexey');
url = res.body;
done();
});
});
});
});
当我运行单元测试我得到一个错误:
TypeError: next is not a function
at Context.middleware (node_modules\express-jwt\lib\index.js:76:16)
我不明白为什么我得到它。请帮帮我 ! 我认为我创造了很少的错误,因为可以找到。
修订
middlewares/token.js
:
var jwt = require('express-jwt');
var config = require('../config');
function getTokenFromHeader(req){
if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Token') {
return req.headers.authorization.split(' ')[1];
}
return null;
}
var token = {
required: jwt({
secret: config.get('jwtSecret'),
userProperty: 'payload',
getToken: getTokenFromHeader
})
};
module.exports = token;
的错误是在你的it('should create a url', token.required, function(done)
线。由于令牌应该是中间件,它需要参数req
,res
和next
。
在您的测试中,您没有向服务器提供令牌,因此您可以从您的测试中除去token.required。
但是,如果您确实对令牌认证进行了测试,则可以通过在自己的next
函数中手动调用token.required
来解决此问题。您还需要在请求中为服务器提供一个jwt。
非常感谢您的回答。 –
it('should create a url', token.required, function(done) {
摩卡测试不允许使用Connect风格的中间件。没有这种支持,通过token.required
到it()
将会调用token.required
。内token.required
jwt()
试图调用回调next
这,是连接中间件函数参数
const express = require('express')
const server = express()
server.use((req, res, next) => {
console.log('this is middleware')
return next() // Call next middleware
})
你并不需要这样做反正考虑到你要测试的路线的一部分。如果路线工作正常,将需要钥匙并且可以工作。您可以通过在没有JWT的情况下发出请求并通过状态代码声明它失败来测试该场景。
非常感谢您的回答。 –
我发布了我的'middleware/token'文件。 –