ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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: '로그아웃 완료'
            });
        });
    });

     

    과정을 설명하자면,

    1. logout success 테스트 케이스가  실행되면 login 모듈 파일에 getSession()함수를 호출한다.
    2. 해당 함수는 위에 작성했듯 로그인 요청 통신을 서버로 발생시킨다.
    3. 서버가 응답을 주면 응답 헤더에서 세션 쿠키 정보를 빼낸 후 새로운 배열로 가공하여 리턴한다.
    4. 세션 쿠키 정보가 담긴 배열을 cookies 변수에 담는다.
    5. '/logout' 으로 로그아웃 요청 통신을 서버로 발생시킬 때 요청 헤더에 세션 쿠키 정보를 함께 설정하여 통신을 발생시킨다.
    6. 응답이 오면 검증한다.

     

     

    JEST 공식 API 문서에는 .jar 프로퍼티에 대한 소개가 없어서 이런 속성이 있는 줄도 몰랐다. -_-

     

     

    테스트 코드를 작성하는 기법은 서비스를 만드는 코딩 기법과는 완전히 다른 스타일이라서 아직 어색하다.

    좀 더 친숙해질 수 있게 모든 HTTP 통신의 테스트 코드를 작성해야겠다.

     

     

     

    참고: 

    https://github.com/facebook/jest/issues/3547

     

    A problem testing Express with Supertest · Issue #3547 · facebook/jest

    We are porting our tests from Mocha to Jest and encountered this weird problem. Do you want to request a feature or report a bug? bug What is the current behavior? The following spec tests login an...

    github.com

     

    '테스팅 > 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
Designed by Tistory.