본문 바로가기
일지/FlowFroge(GTDList)

FlowForge(GTDList) 01-09 일지 컨트롤러 작성 및 TDD 환경 조성

by 리나그(ReenAG) 2024. 1. 10.
728x90
반응형

 흔해빠진 기능마저도 구현하는 데는 참 노력이 많이 들어가는 듯하다. 이메일 확인 절차를 만들기로 결정했는데, 생각보다 고려해야 할게 많았다. 나중에 이메일 확인 절차 같은 건 자동으로... 자동으로...?

 

잠시만...

어째서

 그나마 답변을 보니 외부의 뭔가를(Firebase라던가 AWS Congnito라던가) 경우도 있어서, 완전 노력이 헛되는 않은 것 같다. 하여간에 그것을 위해서 새로운 모델을 넣기로 하기도 했고 해서, 컨트롤러를 더 수정해야 할 것 같다.

- 오늘의 개발

 

커밋로그는 간단한 편이지만 추가된 것은 많다. 라이브러리를 보면서 설명하면 좋으니까 package.json 의 일부도 가져왔다.

 

1. 이메일 토큰을 자동으로 발급하기 위한 crypto

2. 입력값의 확인을 위한 joi

3. 환경설정을 위한 dotenv

4. 비밀번호 저장(해싱)을 위한 bcrypt

5. TDD 조성을 위한 supertest, chai, mocha

 

 적어놓고 나니 의외로 일반적인 기능들이라는 생각이 든다.

1~4번을 user.controller.js에 때려박고, 컨트롤러에서 만들어진 몇몇 기능들을 바로 express로 넘겨주었다.

 

 그다음은 테스트... 인데. 사실 근 2일간은 테스트 때문에 삽질한 게 꽤 있다. 처음에는 단순하게 curl을 이용해서 테스팅을 했었는데, 차라리 이럴 바에야 테스트를 대충 만들어보는 게 좋을 것 같다는 생각을 했다. 원래는 이 backend 전체가 module이 아니라 CommonJS 형식으로 되어 있었는데, 테스트 환경 때문에 죄다 ES6으로 바꾸느냐고 고생했다. 여기서는 짧게 이야기해서 그렇지만, 이 삽질을 굉장히 오래 했다... 대충 만든다는 게 전혀 대충 되지 않아서 짜증 나니까 앞으로는 처음부터 module로 만들어야겠다.

 

 내가 처음 제대로 짜본 test 코드는 현재 이런 상황이다 :

import { expect } from 'chai';
import request from 'supertest';
import app from '../../app.js';

describe('POST /user/register', () => {
    it('registers proper email/password with status 201', (done) => {
        request(app)
            .post('/user/register')
            .send({
                email: 'test123@test.com',
                password: 'TestPASS1!'
            })
            .end((err, res) => {
                expect(res.statusCode).to.equal(201);
                done();
            });
    });
});

describe('DELETE /user', () => {
    it('deletes user with proper email with status 200', (done) => {
        request(app)
            .delete('/user')
            .send({
                email: 'test123@test.com',
                password: 'TestPASS1!'
            })
            .end((err, res) => {
                expect(res.statusCode).to.equal(200);
                done();
            });
    });
});

 

 

 간단하고 빠른 값 검증 형식의 블랙박스 테스트이다. curl로 테스트하던 걸 그대로 옮겼다. 이제 디버깅하겠답시고 명령어 가지고 리퀘스트를 보내는 일은 없을 것 같다. 굿! 경제적으로 테스트를 만드려면 디버깅할 때 만드는 게 제일인 듯하다. 그게 좋은 테스트인지는 고민해 봐야겠지만...

 

 그래도, 이 테스트를 만든 건 역시 디버깅에 탁월하게 도움을 줬다. 다시 에러 때문에 고통받았지만 일상이니까...  response를 전부 볼 수 없는 건 아쉽지만, 정 원한다면 그것도 console.log로 찍어내면 되겠지.

첫 테스트 2개

 이제는 잘 돌아가는 것 같다. 지금은 편의를 위해서 회원가입 / 유저 탈퇴 만을 체크하고 있는데... 다음에는 login 기능을 테스트하는 것도 생각해 봐야겠다. JWT?라는 걸 이용해서 한다는데, 이것도 연구가 필요할 듯싶다.

728x90
반응형