2016-03-19 17 views
0

ログイン後に自分のAPIを使用できます。例えば、/api/salesは以下のコードのような認証が必要です。Mochaサーバが提供する認証されたAPIのテスト

app.all('/api/*', userController.requiresLogin); 
app.route('/api/sales') 
    .get(common.readAll(Sale, 'name')) 
    .post(common.create(Sale)); 

(私はNode.jsのとExpress.jsを使用しています)userController.requiresLogin機能は次のとおりです。

exports.requiresLogin = function(req, res, next) { 
    console.log('Check login...'); 

    if(!req.user) return res.status(401).send(); 
    else next(); 
}; 

ログインするには、私はpassport.jsを使用しています。

exports.login = passport.authenticate('local', { 
    successRedirect: '/', 
    failureRedirect: '/login', 
    failureFlash: false 
}); 

サーバーを実行してこのAPIをブラウザでテストすると、正常に動作します。

このAPIを自動的にテストするために、私はSupertestを使用して自分のMochaテストコードを作成しました。

var request = require('supertest'), 
     should = require('should'), 
     utils = require('./../utils'), 
     mongoose = require('mongoose'); 

    var Sale = mongoose.model('Sale'), 
     User = mongoose.model('User'); 

    var user; 

    describe('Controller Testing:', function() { 
     describe('Sale Controller Testing:', function() { 
      var agent = request.agent(); 

      beforeEach(function(done) { 
       user = new User({ 
        username:'[email protected]', 
        password: 1234, 
        userId: 'default user' 
       }); 
       user.save(); 

       request(app).post('/login') 
        .send({username: '[email protected]', password: '1234'}) 
        .end(function(err, res) { 
         should.not.exist(err); 
         agent.saveCookies(res); 
         done(); 
        }); 
      }); 

      afterEach(function() { 
       User.remove({}, function(){}); 
       Sale.remove({}, function(){}); 
      } 

      it('create a sale', function(done) { 
       var sale = { 
        name: 'New Sale', 
        orders: [order1] 
       }; 

       var req = request(app).post('/api/sales') 
        .send(sale) 
        .expect('Content-Type', /json/) 
        .expect(200); 
       agent.attachCookies(req); 

       req.end(function(err, res) { 
        console.log(res.statusCode); 

        res.body.name.should.equal('New Sale'); 
        done(); 
       }); 
      }); 
    } 

このテストでは、を失敗し続けています。 「販売を作成する」というテストでは、対応するCookieを保存しても、ユーザーがログインしたことを識別することはできません。

答えて

2

チェックsupertest npm page、およびテスト・スクリプト内から来るappここで私は見なかった

var request = require('supertest'), 
    should = require('should'), 
    utils = require('./../utils'), 
    mongoose = require('mongoose'); 

var Sale = mongoose.model('Sale'), 
    User = mongoose.model('User'); 

var user; 

describe('Controller Testing:', function() { 
    describe('Sale Controller Testing:', function() { 
     var agent = request.agent(app); // revised 

     beforeEach(function(done) { 
      user = new User({ 
       username:'[email protected]', 
       password: 1234, 
       userId: 'default user' 
      }); 
      user.save(); 

      agent.post('/login') // revised 
       .send({username: '[email protected]', password: '1234'}) 
       .expect("set-cookie", "check correct cookie here") // appended 
       .end(function(err, res) { 
        should.not.exist(err); 
        //agent.saveCookies(res); 
        // or write some code to check your cookie here 
        done(); 
       }); 
     }); 

     afterEach(function() { 
      User.remove({}, function(){}); 
      Sale.remove({}, function(){}); 
     } 

     it('create a sale', function(done) { 
      var sale = { 
       name: 'New Sale', 
       orders: [order1] 
      }; 

      var req = agent.post('/api/sales') // revised 
       .send(sale) 
       .expect('Content-Type', /json/) 
       .expect(200); 
      //agent.attachCookies(req); 

      req.end(function(err, res) { 
       console.log(res.statusCode); 

       res.body.name.should.equal('New Sale'); 
       done(); 
      }); 
     }); 
} 

としてテスト・スクリプトを修正するには、あなたが正しくそれを持って、cookieParserミドルウェアを適用すると仮定します。

あなたのテストスクリプトの問題は、の添付されたクッキーの前に送信されたリクエストですと思います。多分あなたも試すことができます

var req = aggent.attachCookies(request(app)); 
req.post('/api/sales') 
    .send(sale) 
    .expect('Content-Type', /json/) 
    .expect(200); 
    //agent.attachCookies(req); 
+0

あなたの改訂版が動作します!ありがとう!問題は、私の元のコードが同じ 'agent'を使うのではなく、別々の' request(app) 'を作っているようです。 – byron1st

関連する問題