Jest로 AWS SDK를 조롱하는 방법
9003 단어 testingdevjournalawsjavascript
나에서 미래의 나에게: 예제로 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' }),
});
});
});
희망, 다음에 당신이 이것에 대해 자신에게 감사할 것입니다
~ 진심으로
리타
Reference
이 문제에 관하여(Jest로 AWS SDK를 조롱하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ritaly/how-to-mock-aws-sdk-with-jest-361j텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)