2016-10-04 2 views
3

パスポート認証に依存するエクスプレスルータをヘルパーメソッドを呼び出すためにテストするにはどうすればよいですか?パスポート認証でユニットエクスプレスルートを作成する方法

私は単体テストを表現するのが初めてで、実際にはメソッドを呼び出すためにサーバーにヒットするコードをたくさん見てきました。しかし、それは統合テストにはなりませんか?これは最終的には、明示的な単体テストに関するベストプラクティスについての私の理解の欠如に帰着します。

私はパスポートを模倣しようとしましたが、コールバックにアクセスする必要があるため動作しませんでした。私もrewireを使ってみましたが、ヘルパーメソッドをテストしようとしましたが、どちらもうまくいかないようでした。ファイルはmodule.exportでラップされているからです。

ここにお手伝いいただければ幸いです。私はユニットテストにしようとしている

ファイル:またhttps://github.com/num8er/alttab-nodejs-challenge

例を見て、あなたが望むようにそれを実装:

module.exports = function (inject) { 
var router = require('express').Router(); 
var app = inject.app; 

return router.get('/', app.passport.authenticate('bearer', { session: false }), [editContentCheck, getUser]); 

function editContentCheck(req,res,next) { 
    if(req.authInfo.scope.indexOf('readOwnUser') == -1) { 
     res.statusCode = 403; 
     return res.end('Forbidden'); 
    } 
    return next(); 
} 

function getUser(req, res) { 

    var authHeader = req.headers.authorization.split(' '); 
    var token = authHeader[1]; 
    var models = require('../models'); 

    models.AccessToken.getAccessToken(token,function(err,tokenObj) { 
     models.User.getUser(tokenObj.userId, function(err, user) { 
      if (err) { return done(err); } 
      if (!user) { return done(null, false); } 
      res.send(JSON.stringify(user)); 
     }); 
    }); 

} 
}; 

答えて

3

チェックこのリポジトリ、それはあなたが望むすべてを持っている

1)server.js:

var 
    http = require('http'), 
    app = require('./app'); // app.js file 

http.createServer(app).listen(8080); 

2)app.js:

var 
    express = require('express'), 
    app = express(); 

app.use(require('./routes')); // routes.js file 

module.exports = app; 

3)routes.js:

var router = require('express').Router(); 

function editContentCheck(req,res,next) {} 
function getUser(req, res) {} 

router.get('/posts', app.passport.authenticate('bearer', { session: false }), [editContentCheck, getUser]); 

module.exports = router; 

4)/ AppSpec.jsを規格:

var 
    request = require('supertest-as-promised'), // npm i --save-dev supertest-as-promised 
    app = require('./../app'); 

var token = "some token here"; 

describe('App', function() { 

    describe("Posts", function() { 

    it('should pass auth check and get posts', function() { 
     return request(app) 
       .get('/posts') 
       .set('Authorization', 'Bearer ' + token) 
       .expect(200); 
    }); 

    }); 
}); 

P.S.私はjasmineをテストフレームワークとして使用していますが、mochaでも同じスタイルです。そのため、supertest-as-promisedを使用しているため、httpオブジェクトを作成せずにappモジュールを取得してルートを呼び出します。

p.s.2。単体テストではなく、機能をテストしているので、コードのすべてのチェーンが正しく統合されているかどうかを確認する統合テストです。

+0

ありがとう、私は本当にこの応答に感謝します。その最後のp.s.このようなものに単体テストを追加する方法はありませんか?私は、サーバーの状態やその他のものとは関係なく、自分のロジックをテストするだけのものを探していました。 – FruitPunchSamurai

+0

希望するとおりに変更してください。あなたのコードの任意の要素を要求し、その機能をチェックすることができます。 – num8er

+0

私はここで何か誤解しているかもしれませんが、パスポートを模倣する方法はありますか?今私はトークンを取得し、上記のトークン変数のためにそれを置く必要があると思う。 – FruitPunchSamurai

関連する問題