[TIL]19.08.20

BenKim·2020년 8월 20일
0
post-thumbnail
post-custom-banner

오늘한일

  • jest와 supertest로 서버API 테스트케이스 작성

이슈 & 해결

1.cors samesite문제

테스트중 서버쪽을 담당하는 나와 페어의 2개의 서버를 사용하였었는데
클라이언트쪽에서 이것때문에 에러가 발생했다고 한다.
찾아보니 이런경우 사용자가 사이트간 요청위조(CSRF)를 할수 있어 보안적으로 취약하다고 한다.

2.supertest로 테스트케이스를 만들고 test를 돌려 요청을 보냈는데 postman으로 보낼때와 응답이 다르고 .catch() 문에 에러걸려 응답하고 있었다.


먼저 에러핸들링에 대해

//아래와 같이 에러가 무엇인지에 대한 부분을 확인하는과정은 없었다.
.catch(()=>{
  res.status(400).send({error: '400 Bad Request'})
  
/*프로젝트 오피스아워에 질문한 결과 이런경우 console.log를 API초입에 넣어서 요청이 
API까지 잘 들어오는지 확인하고, 이후 req.body를 통해 요청 값들이 잘 들어오는지 확인한다.
그럼에도 불구하고 에러가 난다면 에러코드를보고 해당부분에 가서 err를 console.log로 확인해본다.*/
.catch((err)=>{
    console.log(err);
    res.status(400).send({error: '400 Bad Request'});
// 확인결과 데이터베이스 연결이 안되어있었다.
  • config.json파일에는 개발시 사용될 데이터베이스와 테스트시 사용될 데이터베이스가 분리되어있다.
    내가 jest를 사용해 test를 돌리는 순간 이는 변경된다.

    그래서 test부분의 데이터베이스를 생성해주고 입력해주었더니 잘 동작하였다.

3.supertest테스트문 timeout에러

  • 아마 기본적인 세팅으로 5초후에 테스트가 실행되는데 그 시간안에 supertest가 요청을 보내고 응답을 받지 못해서 발생하는 오류인것 같다. 구글링해본결과 관련내용이 있어 시간을 넉넉하게 30초로 변경시켰다.
 describe('POST /login', () => {
        test('login success', async (done) => {
            const response = await request(app).post('/login').send({
                "email": "praconfi@gmail.com",
                "password": "dksld",
            })
            expect(response.status).toBe(200);
            expect(response.body).toHaveProperty('id', 'email', 'username');
            done();
        }, 30000);
    })

https://stackoverflow.com/questions/49603939/async-callback-was-not-invoked-within-the-5000ms-timeout-specified-by-jest-setti

4.테스트 종료후 남아있는 메세지

비동기적으로 작동하는 부분이 테스트내에서 끝나지 않았다는 내용이다.
구글링결과 테스트의 마지막에 done();을 붙이라고 해서 다 붙였는데도 같은증상이 보여서
아래 설명에서 하라는대로 --detectOpenHandlers를 붙이니 해결되었다.

느낀점

항상 테스트케이스를 통과하기위해 스프린트들을 진행해왔는데, 이제보니 참 잘만들어진 테스트들 이었다는 생각이 든다. 해당 내용을 잘 이해했는지를 확인할수있게 도와주는 테스트를 만드는것은 테스트를 푸는것의 몇배의 노력이 들것같다.

profile
연습과 자신감
post-custom-banner

0개의 댓글