Jest e2e JwtAuthGuard mock

이건선·2023년 5월 24일
0

해결

목록 보기
41/48
post-custom-banner

문제점 : 게시글을 작성하는 API의 Jest e2e 테스트에서 expected 201 "Created", got 401 "Unauthorized" 오류가 발생함

시도해본 것 :

return request(app.getHttpServer())
      .post('/api/postCards/post/createPost')
      .set('Authorization', `Bearer ${payload.sub}`) // Assuming JWT is being used for auth
      .attach('files', Buffer.from([]), 'filename.txt')
      .field(createCardDto)
      .expect(201)
      .expect({ msg: '포스트 작성에 성공했습니다.' });
  });

.set('Authorization', `Bearer ${payload.sub}`) 사용해봤다. 하지만 여전히 Jwt인증 오류가 발생했다.

해결 :

let useMock = true;
jest.mock('../src/auth/jwt/jwt.guard', () => ({
  JwtAuthGuard: jest.fn().mockImplementation(() => ({
    canActivate: jest.fn().mockImplementation((context) => {
      if (useMock) {
        const req = context.switchToHttp().getRequest();
        req.user = {
          sub: 'd87f78c5-7e86-44d7-a065-d994668d5e84' as `${string}-${string}-${string}-${string}-${string}`,
        };
        return true;
      }
    }),
  })),
}));

...

it('/post/createPost (POST)', () => {
    const createCardDto = {
      title: 'Test Title',
      maincategory: 'TestCategory',
      category: 'SubCategory',
      desc: 'Test Description',
      pollType: 'Test Poll Type',
      pollTitle: 'Test Poll Title',
      tag: 'TestTag',
      imgUrl: 'https://example.com/test.jpg',
    };

    const payload = {
      sub: '21c01d77-e275-4eea-bc97-209cb980415a' as `${string}-${string}-${string}-${string}-${string}`,
    };

    return request(app.getHttpServer())
      .post('/api/postCards/post/createPost')
      .set('Authorization', `Bearer ${payload.sub}`) // Assuming JWT is being used for auth
      .attach('files', Buffer.from([]), 'filename.txt')
      .field(createCardDto)
      .expect(201)
      .expect({ msg: '포스트 작성에 성공했습니다.' });
  });

알게 된 점 :

  1. 모듈의 JwtAuthGuard를 모의(Mock) 객체로 교체해야 한다.
  2. JwtAuthGuard를 모의 객체로 교체하여 canActivate 메서드가 무조건 true를 반환하도록 한다.
  3. 그리고 요청 객체(req)의 user 프로퍼티에 임의의 사용자 정보를 설정해 준다.

결론 : 실제 인증 절차를 건너뛰고, 인증이 성공한 것처럼 서버에게 알리는 테스트 전용 인증 과정을 실행하는 것이다.

profile
멋지게 기록하자
post-custom-banner

0개의 댓글