Jest로 AWS SDK를 조롱하는 방법

친애하는 저널

나에서 미래의 나에게: 예제로 AWS SDK S3에 대한 단위 테스트를 작성하는 방법(Jest로 미리 서명된 URL).

나는 모의를 싫어한다.
그렇기 때문에 필요할 때 사용하는 방법을 항상 잊어버렸습니다.

오 Rita, AWS SDK 서비스를 다시 시도했습니까spyOn? 🤦‍♀️

🛑 중지

다음 중 하나를 수행해야 합니다.
  • 객체의 모의 요소(객체가 있을 때)
  • 모의 전체 파일( @aws-sdk/s3-request-presigner ). 싫지만 다른 것으로 포장하고 싶지 않다면 선택의 여지가 많지 않은 것 같아요 🤷‍♂️

  • 이것이 OOP와 의존성 주입(수동인 경우에도)이 더 나은 이유 중 하나입니다(개인 취향). 단위와 종속성을 정의한 다음 테스트에서 계약을 이행하는 무언가를 제공하기만 하면 됩니다. 개체, 파일 등을 덮어쓸 필요가 없습니다. 🚫 모의가 없습니다.

    그러나 때로는 다른 옵션이 없습니다.

    javascript 또는 typescript 파일이 있다고 가정해 보겠습니다.

    
    // handler.ts
    
    import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
    import { GetObjectCommand } from '@aws-sdk/client-s3';
    
    export const handler: Handler = async () => {
      /* do stuff */
      const command = new GetObjectCommand(input);
      const url = await getSignedUrl(client, command, { expiresIn: 1200 });
      /* do other stuff */
    }
    
    


    그런 다음 사양 파일에서:
  • 전체 모듈의 모형을 만듭니다
  • .
  • 원하는 대로 빈 모의 함수를 사용하십시오.

  • // handler.spec.ts
    
    jest.mock('@aws-sdk/s3-request-presigner');
    import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
    
    jest.mock('@aws-sdk/client-s3');
    import { GetObjectCommand } from '@aws-sdk/client-s3';
    
    import { handler } from './handler';
    
    test('when sth do sth', async () => {
      const expectedInput = { ... };
      await handler();
      expect(GetObjectCommand).toHaveBeenCalledWith(expectedInput);
      expect(getSignedUrl).toHaveBeenCalled();
    });
    
    


    솔직히 이 기능은 테스트하지 않습니다. sth가 호출되었다는 사실만으로는 예상되는 동작이 발생했는지 확인하기에 충분하지 않습니다. "실제"동작을 얻으려면 getSignerUrl() 응답을 조롱해야 합니다.

    그래서 함수 응답을 테스트하기 위해 모의를 작성하는 지점에 이르렀습니다. 함수 응답은 다른 모의 응답이지만 기술적으로 함수 응답과 예상 출력의 가장 가까운 시뮬레이션입니다.

    // handler.spec.ts
    
    jest.mock('@aws-sdk/s3-request-presigner');
    import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
    
    jest.mock('@aws-sdk/client-s3');
    import { GetObjectCommand } from '@aws-sdk/client-s3';
    
    import { handler } from './handler';
    describe('GetUrl', () => {
      const getSignedUrlMock: jest.Mock = getSignedUrl as any; // calm down TypeScript screaming about types
    
      test('when sth do sth', async () => {
        getSignedUrlMock.mockResolvedValue('example-url.com');
        const expectedInput = { ... };
        const response = await handler();
    
      expect(GetObjectCommand).toHaveBeenCalledWith(expectedInput);
        expect(response).toEqual({
          statusCode: 200,
          body: JSON.stringify({ url: 'example-url.com' }),
        });
      });
    });
    
    


    희망, 다음에 당신이 이것에 대해 자신에게 감사할 것입니다

    ~ 진심으로
    리타

    좋은 웹페이지 즐겨찾기