-
[supertest] express-session 테스트는 어떻게 할까?테스팅/JEST 2019. 11. 1. 14:28
1. 고민
JEST를 통해 supertest npm 모듈로 HTTP 통신 API 테스트를 하고 있다.
로그인 테스트는 모든 케이스를 통과했고, 로그아웃 테스트를 진행했다.
로그아웃이 정상적으로 작동하는 테스트 케이스를 짜고 수행했다.
그 결과, 세션 정보가 없으니 '로그인 후에 이용'하라는 서버 에러를 발생시켰다.
이는 클라이언트에서 세션 쿠키 정보가 없어서 발생하는 문제라는 걸 파악했고, '테스트 과정에선 세션 테스트는 어떻게 하는가?' 고민하고 검색하여 해결할 수 있었다.
2. 해결과정
가장 먼저 프로젝트에 로그인 상태를 체크하는 기능이 많으니 테스트 코드 전용 '로그인 후 발급받은 세션 쿠키 정보를 리턴하는 공통 함수를 모듈화'했다.
supertest.ts
import supertest from 'supertest'; import app from '../../../src/app'; // express() const http = supertest(app); export default http;
login.ts
import http from '../app/supertest'; export async function getSession(): Promise<Array<string>> { const response = await http.post('/logout').send({username: 'hong', password: 'gildong'}); expect.(response.status).toBe(200); const sessionCookie: Array<string> = response.header['set-cookie'][0] .split(',') .map((cookie: string) => { return cookie.split(';')[0]; }); return sessionCookie; }
이렇게 세션 정보를 구하는 함수를 모듈화하여 어떠한 테스트에서도 호출해서 세션 테스트를 할 수 있도록 했다.
그리고 이제 로그아웃 코드를 짜보자.
logout.test.ts
import http from './supertest'; import * as login from '../functions/login'; describe('GET /logout', () => { test('logout success', async () => { const cookies: Array<string> = await login.getSession(); const response = await http.get('/logout').set('Cookie', cookies); // 세션 쿠키 요청 헤더에 설정 expect(response.status).toBe(200); expect(response.body).toEqual({ message: '로그아웃 완료' }); }); });
과정을 설명하자면,
- logout success 테스트 케이스가 실행되면 login 모듈 파일에 getSession()함수를 호출한다.
- 해당 함수는 위에 작성했듯 로그인 요청 통신을 서버로 발생시킨다.
- 서버가 응답을 주면 응답 헤더에서 세션 쿠키 정보를 빼낸 후 새로운 배열로 가공하여 리턴한다.
- 세션 쿠키 정보가 담긴 배열을 cookies 변수에 담는다.
- '/logout' 으로 로그아웃 요청 통신을 서버로 발생시킬 때 요청 헤더에 세션 쿠키 정보를 함께 설정하여 통신을 발생시킨다.
- 응답이 오면 검증한다.
JEST 공식 API 문서에는 .jar 프로퍼티에 대한 소개가 없어서 이런 속성이 있는 줄도 몰랐다. -_-
테스트 코드를 작성하는 기법은 서비스를 만드는 코딩 기법과는 완전히 다른 스타일이라서 아직 어색하다.
좀 더 친숙해질 수 있게 모든 HTTP 통신의 테스트 코드를 작성해야겠다.
참고:
https://github.com/facebook/jest/issues/3547
'테스팅 > JEST' 카테고리의 다른 글
Jest did not exit one second after the test run has completed. (0) 2019.11.06 jest-validate (0) 2019.10.31 jest-get-type (0) 2019.10.31 jest-docblock (0) 2019.10.31 jest-diff (0) 2019.10.31