728x90

e2e 테스트를 강의에서 배우고 현재 프로젝트에 적용하기 시작했다.

 

근데 처음부터 소셜 회원가입/로그인 로직을 만났다..

 

일단 나는 커스텀가드를 만들어서 전역 설정하고, 몇몇 path에 커스텀 데코레이터를 붙여 커스텀가드를 통과하게 만들어두었다.

그리고 앞서 말한 소셜 회원가입/로그인은 커스텀 데코레이터를 통해 커스텀가드를 통과하면  @UseGuards(DynamicAuthGuard)를 만나게된다.

// 소셜 회원가입/로그인
  @Get('signup/:social')
  @Public()
  @UseGuards(DynamicAuthGuard)
  async signUp(
    @Req() req: Request & IOAuthUser, //
    @Res() res: Response,
  ): Promise<void> {
    if (req.user) {
      await this.authService.signUp({ ...req, res });
      res.redirect(this.configService.get(envKeys.redirectURL));
    }
  }

DynamicAuthGuard는 params로 들어온 소셜을 체크하고, 그에 맞는 PassportStrategy로 소셜로그인을 진행한다.

 

우선 이 로직을 실제와 맞게 검증은 불가능 하므로, DynamicAuthGuard에서 이루어지는 소셜로그인의 mocking 하려고 했다.

 

chatGPT가 알려준 방법으로 열심히 mocking을 했지만 계속 안되었다.

결국 인터넷에서 찾은 방법 따라해보고 해결하긴했는데, 내가 해봤던 방법이었다. 그래서 일단 문제가 해결된 원인을 유추해보자면, 전역설정했던 커스텀가드를 제거한 이후에 되었기 때문에 전역설정된 커스텀가드가 mocking을 방해했을수 있는데 타이밍상 이게 가장 유력하다.

아니면 .overrideGuard()가 아니라 .overrideProvider()에 적용했었기 때문일수도 있지만, 기억상 .overrideGuard()에 적용했을때도 안되었었다.

가장 가능성이 낮지만 mock의 로직을 완벽하게 구현한게 아니라 실행되는지 알아볼정도로 구현을 먼저해두었었다. 이때문일 수도 있지만 글쎄.. 동작하는지 log 찍어놓았던게 계속 안나오다가 갑자기 나왔던걸로 봤을때 가장 가능성이 낮아보이긴 하다.

아니면.. 밤을 새서 헷갈린걸지도....?

 

무튼 그래서 어떻게 처리를 했냐면

const mockDynamicAuthGuard = {
  canActivate: (context: ExecutionContext) => {
    const request = context.switchToHttp().getRequest();
    const { social } = request.params;
    if (!SOCIAL_PROVIDERS.includes(social)) {
      throw new BadRequestException('잘못된 소셜 요청');
    }
    request.user = { id: 'mockSocailId', provider: social };
    return true;
  },
};

우선 mock을 만들었다. (mock은 실제 DynamicAuthGuard와 소셜 PassportStrategy가 합쳐진 로직으로 만들었다.)

 

beforeAll(async () => {
    const moduleFixture: TestingModule = await Test.createTestingModule({
      imports: [AppModule],
    })
      .overrideGuard(DynamicAuthGuard)
      .useValue(mockDynamicAuthGuard)
      .compile();

mock으로 실제 가드를 대체하는 코드를 넣어준다.

 

describe('[GET /signup/:social]', () => {
    it.each(SOCIAL_PROVIDERS)('회원가입 하기 성공: %s', async (social) => {
      const { statusCode, headers } = await request(app.getHttpServer()).get(
        `/signup/${social}`,
      );

      expect(statusCode).toBe(302);
      expect(headers['set-cookie']).toBeDefined();
      const hashRefreshToken = headers['set-cookie'][0].includes('refreshToken=');
      expect(hashRefreshToken).toBe(true);
    });
  });

테스트한다.

 

끝이다..

이거 떄문에 몇시간 고생했다..

 

만약 오류로 인해 이글을 찾았고, 똑같이 했는데 해결이 안되었다면, 위에 적어둔 오류의 원인을 유추한 내용을 한번 확인해보자.

 

아래는 이 오류의 해결을 도와준 블로그이다.

 

 

https://velog.io/@calm0_0/NestJS-e2e-test-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-Auth-Guard%EC%97%90-%EB%8C%80%ED%95%9C-%EC%B2%98%EB%A6%AC

 

[NestJS] e2e test 환경에서 Auth Guard에 대한 처리

e2e test 에서 Guard 를 오버라이드하기

velog.io

 

728x90

'코딩 > 문제&에러' 카테고리의 다른 글

TypeORM CASCADE  (0) 2024.11.12
Nest e2e test DB PK 초기화  (3) 2024.11.11
cacheManager.caching is not a function  (0) 2024.10.25
nth-check  (0) 2024.09.20
error: RPC failed; HTTP 400 curl 22 The requested URL returned error: 400  (0) 2024.08.26

+ Recent posts