Sto provando a verificare il mio login locale. Ho implementato con passport.js
, seguendo la sua guida e seguendo questo scheletro MEAN.Accesso test unitario con passport.js e express.js
Sono abbastanza sicuro che l'implementazione sia soddisfacente, ma c'è qualcosa di sbagliato nel test che fallisce sempre l'autenticazione.
Se l'autenticazione fallisce dovrebbe essere redirect a "/ signin"
se l'autenticazione è corretto si deve andare a "/"
Ma quando prova, l'autenticazione non riesce sempre.
Questo è routes.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);
});
}
));
}
e test: 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();
});
});
});
Thi s è ciò che il terminale visualizza:
<Unit Test>
API User:
Authentication
1) Local login
0 passing (24ms)
1 failing
1) <Unit Test> API User: Authentication Local login:
actual expected
/signin
Si! Molte grazie! Il mio problema era nel 'server = request.agent (" http: // localhost: 3000 ");'. Ho messo 'server = request.agent (app);' e questo è tutto! ;) –
Ho un login e un'autenticazione molto simile. Sto cercando di adattare questo codice per i miei bisogni. Per qualche motivo l'utente del test non è stato creato nel mio DB. Quale potrebbe essere la causa di questo? – MadPhysicist
L'unità prova sopra solo per il test. Il processo è inserire un nuovo utente, controllare il test di accesso, quindi eliminare l'utente dopo il test. quindi dopo il test completo l'utente dovrebbe essere cancellato. –