2017-10-16 1 views
1

Express 서버가 있으며 인증을 위해 passport-local을 사용하고 있습니다. 다음과 같은 보호 된 경로가 있습니다 :모카 차이 (Mycha Chai) 보호 경로 테스트

app.post("/api/test", connect.ensureLoggedIn("/"), (req, res) => { 
let test = new Test(req.body); 

test 
    .save() 
    .then(data => { 
    return res.json(data); 
    }) 
    .catch(e => { 
    return res.status(HTTP_RESPONDE_BAD_REQUEST).send(e); 
    }); 
}); 

위에서 언급 한 경로를 테스트하여 사용자가 로그온했는지 어떻게 확인할 수 있는지 궁금합니다.

이 내 현재 테스트 (I 인증을 보낼 수 않네 있기 때문에, 통과하지 못할 것입니다 :

it("Testing protected route", done => { 
chai 
    .request(server) 
    .post("/api/test") 
    .send(test) 
    .end((err, res) => { 
    expect(res.status).to.equal(200); 
    done(); 
    }); 
}); 

나는 다음을 시도,하지만 테스트를 실행할 때 그들이 나를는 로그인 페이지로 리디렉션합니다.

it("Testing protected route", done => { 
chai 
    .request(server) 
    .post("/api/test") 
    .set('Authorization', 'Bearer ' + token) // user token id 
    .send(test) 
    .end((err, res) => { 
    expect(res.status).to.equal(200); 
    done(); 
    }); 
}); 

it("Testing protected route", done => { 
chai 
    .request(server) 
    .post("/api/test") 
    .set('token', token) // user token id 
    .send(test) 
    .end((err, res) => { 
    expect(res.status).to.equal(200); 
    done(); 
    }); 
}); 

내가 내 단위 테스트에 대한 supertestmocha를 사용하고이를 테스트 할 수있는 쉬운 방법?

+0

두 번째 예는 로그인하거나에 token''유효한을 작성해야한다는 점을 제외 그것을 할 올바른 방법입니다 용도. – doublesharp

+0

유효한 토큰을 사용하고 있습니다. 우편 배달부에서 잘 작동합니다. – Glund

+0

제 앱에서 똑같은 일을하고 있습니다. 유효한 토큰으로 잘 작동하고 있습니다. 올바른 헤더가 있다고 가정합니다. – doublesharp

답변

0

뿐만 아니라 사용자 정의 머리 있습니까 어쩌면 내 테스트에 비슷한 패턴을 사용하고있다. 테스트를 실행하기 전에 데이터가 데이터베이스에로드되고 사용자가 로그인 한 다음 인증이 필요한 각 테스트에 해당 토큰이 사용됩니다.

TestUtils 클래스

this.authenticateUser = (user, app) => 
    new Promise((resolve, reject) => { 
     request(app) 
     .post('/authenticate') 
     .send({ 
     email: user.email, 
     password: user.test_password, 
     }) 
     .end((err, res) => { 
     if (err) { 
      return reject(err); 
     } 
     return resolve(res.body.token); 
     }); 
    }); 

테스트 클래스

describe('Authed Routes',() => { 
    let app = null; 

    let authUser = null; 

    before((done) => { 
    // mocking should happen before the app is created. 
    app = require('../server'); 

    // Populate redis data 
    TestUtils.populateRedis(() => { 
     // Populate db data 
     TestUtils.syncAndPopulateDatabase('public-tests',() => { 
     // Get the test user 
     authUser = TestUtils.getUser(); 
     // Authenticate the user to get a token 
     TestUtils.authenticateUser(authUser, app) 
     .then((accessToken) => { 
      // Keep the token on the user so we can use it in the tests 
      authUser.access_token = accessToken; 
      return done(); 
     }) 
     .catch((err) => done(err)); 
     }); 
    }); 
    }); 

    describe('/secure/route',() => { 
    it('should allow /secure/route with correct token provided', (done) => { 
     request(app) 
     .get('/secure/route') 
     // add the access token from the user as a header value 
     .set('x-access-token', authUser.access_token) 
     .expect(200) 
     .end((err, res) => { 
     done(); 
     }); 
    }); 
    }); 
}); 
관련 문제