2013-11-23 2 views
5

ローカルログインをテストしようとしています。私はpassport.jsで実装しました。そのガイドの後に、MEANスケルトンの後に続いています。passport.jsとexpress.jsによるユニットテストログイン

私は、実装は問題ないとは確信していますが、常に認証に失敗するテストには何か問題があります。

認証は、認証が正しい場合は、「/サインイン」
が、それは行くべきであるためにリダイレクトされなければならない障害が発生した場合、「/」

しかし、私がテストしたときに、認証は常に失敗します。

module.exports = function(app, passport, auth) { 
    var users = require('../app/controllers/users'); 
    app.get('/signin', users.signin); 

    app.post('/users/session', passport.authenticate('local', { 
     failureRedirect: '/signin', 
     failureFlash: 'Invalid email or password.' 
    }), users.session); 

    var index = require('../app/controllers/index'); 
    app.get('/', index.render); 

passport.js

var mongoose = require('mongoose'), 
LocalStrategy = require('passport-local').Strategy, 
User = mongoose.model('User'), 
config = require('./config'); 


module.exports = function(passport) { 
    //Serialize sessions 
    passport.serializeUser(function(user, done) { 
     done(null, user.id); 
    }); 

    passport.deserializeUser(function(id, done) { 
     User.findOne({ 
      _id: id 
     }, '-salt -hashed_password', function(err, user) { 
      done(err, user); 
     }); 
    }); 

    //Use local strategy 
    passport.use(new LocalStrategy({ 
      usernameField: 'email', 
      passwordField: 'password' 
     }, 
     function(email, password, done) { 
      User.findOne({ 
       email: email 
      }, function(err, user) { 
       if (err) { 
        return done(err); 
       } 
       if (!user) { 
        return done(null, false, { 
         message: 'Unknown user' 
        }); 
       } 
       if (!user.authenticate(password)) { 
        return done(null, false, { 
         message: 'Invalid password' 
        }); 
       } 
       return done(null, user); 
      }); 
     } 
    )); 
} 

及び試験:api.js

var User, app, mongoose, request, server, should, user; 

should = require("should"); 
app  = require("../server"); 
mongoose = require("mongoose"); 
User  = mongoose.model("User"); 
request = require("supertest"); 
server = request.agent("http://localhost:3000"); 

describe("<Unit Test>", function() { 
    return describe("API User:", function() { 
    before(function(done) { 
     user = new User({ 
     email : "[email protected]", 
     firstName: "Full Name", 
     lastName : "Last Name", 
     password : "pass11" 
     }); 
     user.save(); 
     return done(); 
    }); 
    describe("Authentication", function() { 
     return it("Local login", function(done) { 
     return server.post("https://stackoverflow.com/users/session").send({ 
      email : "[email protected]", 
      password: "pass11" 
     }).end(function(err, res) { 
      res.headers.location.should.have.equal("/"); 
      return done(); 
     }); 
     }); 
    }); 
    return after(function(done) { 
     User.remove().exec(); 
     return done(); 
    }); 
    }); 
}); 

ティ

これは、routes.jsありますsがどのようなターミナルディスプレイです:

<Unit Test> 
    API User: 
     Authentication 
     1) Local login 


    0 passing (24ms) 
    1 failing 

    1) <Unit Test> API User: Authentication Local login: 

     actual expected 

     /signin 

答えて

8

ここではそれ以上の基準チェックこのtest-user

私のスクリーンショットのために

var User, app, mongoose, request, server, should, user, agent; 

should = require("should"); 
app  = require("../server"); 
mongoose = require("mongoose"); 
User  = mongoose.model("User"); 
request = require("supertest"); 
agent = request.agent(app) 

describe('User', function() { 
    before(function(done) { 
     user = new User({ 
     email : "[email protected]", 
     firstName: "Full Name", 
     lastName : "Last Name", 
     password : "pass11" 
     }); 
     user.save(done) 
    }); 
    describe('Login test', function() { 
     it('should redirect to /', function (done) { 
     agent 
     .post('/users/session') 
     .field('email', '[email protected]') 
     .field('password', 'pass11') 
     .expect('Location','/') 
     .end(done) 
     }) 

    after(function(done) { 
     User.remove().exec(); 
     return done(); 
    }); 

}) 
}) 

を予想通り、私はこのコードと作品を使用しようとしている enter image description here

+0

うん!どうもありがとう!私の問題は 'server = request.agent(" http:// localhost:3000 ");'にありました。私は 'server = request.agent(app);'を入れました。それだけです! ;) –

+0

私は非常によく似たログインと認証を持っています。私はこのコードを自分の必要に合わせて適応しようとしています。何らかの理由で、テストユーザーが自分のDBに作成されていません。これの原因は何でしょうか? – MadPhysicist

+0

単体テストはテストのためのものです。プロセスは、新しいユーザーを挿入し、ログインテストを確認し、テスト後にユーザーを削除します。テストが完了した後、ユーザーは削除されるはずです。 –

関連する問題