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; 
+0

我发布了我的'middleware/token'文件。 –

的错误是在你的it('should create a url', token.required, function(done)线。由于令牌应该是中间件,它需要参数req,resnext

在您的测试中,您没有向服务器提供令牌,因此您可以从您的测试中除去token.required。

但是,如果您确实对令牌认证进行了测试,则可以通过在自己的next函数中手动调用token.required来解决此问题。您还需要在请求中为服务器提供一个jwt。

+0

非常感谢您的回答。 –

it('should create a url', token.required, function(done) {

摩卡测试不允许使用Connect风格的中间件。没有这种支持,通过token.requiredit()将会调用token.required。内token.requiredjwt()试图调用回调next这,是连接中间件函数参数

const express = require('express') 
const server = express() 

server.use((req, res, next) => { 
    console.log('this is middleware') 
    return next() // Call next middleware 
}) 

你并不需要这样做反正考虑到你要测试的路线的一部分。如果路线工作正常,将需要钥匙并且可以工作。您可以通过在没有JWT的情况下发出请求并通过状态代码声明它失败来测试该场景。

+0

非常感谢您的回答。 –