2017-07-02 1 views
-2

J'essaie d'écrire les tests unitaires en utilisant Mocha, Chai et Supertest, mais maintenant, malheureusement, sans succès.
J'ai itinéraire suivant:NodeJs: suivant n'est pas la fonction

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; 
} 

j'enregistre les données dans le MongoDB en utilisant mangouste. pour la route, j'ai écrit le test unitaire:

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

}); 

Quand je lance le test unitaire je reçois une erreur:

TypeError: next is not a function 
     at Context.middleware (node_modules\express-jwt\lib\index.js:76:16) 

Je ne comprends pas pourquoi je l'obtenir. Aidez-moi, s'il vous plaît! Je pense que j'ai créé peu l'erreur que depuis peut trouver.

MISE À JOUR

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

J'ai posté mon fichier 'middleware/token'. –

Répondre

1

L'erreur est sur votre ligne it('should create a url', token.required, function(done). Parce que le jeton est censé être un middleware, il faut les paramètres req, res et next.

Lors de votre test, vous ne fournissez pas de jeton au serveur, vous pouvez donc supprimer le jeton requis lors de votre test. Si vous faites un test pour l'authentification par jeton, cependant, vous pouvez contourner ce problème en appelant manuellement token.required à l'intérieur de votre test avec votre propre fonction next. Vous devrez également fournir le serveur avec un jwt dans votre demande.

+0

Merci beaucoup pour votre réponse. –

0

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

tests Mocha ne permettent pas l'utilisation de middleware de style Connect. Sans ce support, le passage token.required à it() appellera token.required. jwt() au sein token.required tente d'invoquer le rappel next qui, fait partie des args de la fonction middleware Connect

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

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

Vous n'avez pas besoin de le faire de toute façon vous considérer voulez tester la route. Si la route fonctionne correctement, elle nécessitera la clé et fonctionnera. Vous pouvez tester ce scénario en effectuant une requête sans JWT et affirmer qu'il échoue via le code d'état.

+0

Un grand merci pour la réponse. –