2017-07-02 12 views
-2

私はMocha、Chai、Supertestを使ってユニットテストを書こうとしていますが、残念ながら失敗しました。
私は、次のルートを持っている:NodeJs:next is not function

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

ミドルウェア/トークンファイルを投稿しました。 –

答えて

1

エラーがit('should create a url', token.required, function(done)ライン上にあります。トークンはミドルウェアであるため、パラメータreq,resおよびnextが必要です。

テストでは、サーバーにトークンを提供していないため、テストからtoken.requiredを削除できます。

ただし、トークン認証のテストを行う場合は、機能でテスト内でtoken.requiredを手動で呼び出してこの問題を回避することができます。また、要求にjwtをサーバーに提供する必要があります。

+0

多くのお返事ありがとうございます。 –

0

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

モカテストはConnectスタイルミドルウェアの使用を許可していません。そのサポートがなければ、token.requiredit()に渡すと、token.requiredが呼び出されます。 token.requiredjwt()は、あなたがルートをテストしたい考慮とにかくこれを実行する必要はありません接続ミドルウェア機能引数

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

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

の一部であり、コールバックnextを起動しようとしています。ルートが正常に機能している場合は、キーが必要になり、機能します。 JWTを使わずにリクエストを行い、ステータスコードで失敗したと主張することで、そのシナリオをテストできます。

+0

多くのお返事ありがとうございます。 –

関連する問題