> 웹 프론트엔드 > JS 튜토리얼 > Jest와 SuperTest를 사용하여 GraphQL 애플리케이션 테스트

Jest와 SuperTest를 사용하여 GraphQL 애플리케이션 테스트

Linda Hamilton
풀어 주다: 2025-01-14 07:31:44
원래의
994명이 탐색했습니다.

Testing a GraphQL Application with Jest and SuperTest

이 블로그 게시물에서는 Jest 및 SuperTest를 사용하여 GraphQL API를 테스트하는 것과 관련된 과제와 솔루션을 살펴보겠습니다. Jest 테스트에서 특히 토큰 기반 인증을 위한 헤더를 시뮬레이션해야 하는 필요성에서 여정이 시작되었습니다.

과제: Jest에서 헤더 시뮬레이션

Woovi 챌린지를 위해 Todo Backend GraphQL 프로젝트를 개발하던 중 심각한 장애물에 부딪혔습니다. HTTP 헤더에 전달된 JWT(JSON 웹 토큰)를 사용하는 GraphQL API의 인증을 테스트해야 했습니다. 처음에는 Jest에서 이러한 헤더를 시뮬레이션하는 간단한 방법을 찾는 데 어려움을 겪었습니다. 표준 Jest 설정으로는 실제 서버와 같은 방식으로 HTTP 요청 및 응답을 직접 처리하지 않았기 때문에 충분하지 않았습니다.

해결책: SuperTest 발견

몇 번의 시행착오 끝에 HTTP 어설션용으로 설계된 라이브러리인 SuperTest를 발견했습니다. SuperTest는 마치 실제 클라이언트인 것처럼 HTTP 서버를 테스트할 수 있도록 하여 Jest의 기능을 확장합니다. 이 기능을 사용하면 API 인증에 필요한 인증 토큰을 포함하여 헤더를 시뮬레이션할 수 있습니다.

테스트 환경 설정

테스트에 앞서 환경을 설정해 볼까요.

  1. 종속성 설치 먼저 Jest, SuperTest, Faker가 설치되어 있는지 확인하세요.
   npm install --save-dev jest supertest faker
로그인 후 복사
  1. Jest 구성 jest.config.js 파일을 만듭니다.
   module.exports = {
     preset: 'ts-jest',
     testEnvironment: 'node',
   };
로그인 후 복사
  1. 테스트 케이스 작성 환경이 준비되었으므로 이제 테스트 케이스를 작성할 수 있습니다.

SuperTest로 테스트 작성

SuperTest가 이 시나리오의 판도를 바꾸었습니다. API의 CRUD 작업 및 인증을 테스트하는 데 이를 사용한 방법은 다음과 같습니다.

SuperTest로 CRUD 작업 테스트

  1. 설정 및 해제 설정 및 해제를 위해 Jest의 beforeAll 및 afterAll 후크를 사용하세요.
   import { connect, disconnectDatabase } from './mongooseConnection';
   import supertest from 'supertest';
   import app from './../index';

   beforeAll(async () => {
     await connect();
   });

   afterAll(async () => {
     await disconnectDatabase();
   });
로그인 후 복사
  1. 인증 및 토큰 사용 테스트 사용자를 등록하고 토큰을 가져오는 도우미 함수를 만듭니다.
   import { faker } from '@faker-js/faker';
   import { graphql } from 'graphql';
   import { schema } from '../schema';

   async function authUserTest() {
     const userTest = {
       name: faker.name.firstName(),
       email: faker.internet.email(),
       password: faker.internet.password(),
     };
     const source = `
       mutation {
         register(name: "${userTest.name}", email: "${userTest.email}", password: "${userTest.password}") {
           token
           user {
             name
             email
           }
         }
       }
     `;
     const result = await graphql({ schema, source });
     const data = result.data?.register;
     return data.token;
   }
로그인 후 복사
  1. CRUD 작업 테스트

    • 새 작업 만들기
     it('should create a new task', async () => {
       const todo = {
         task: faker.lorem.words(),
         status: faker.helpers.arrayElement(['pending', 'complete', 'in progress']),
       };
       const query = `
         mutation {
           todo(task: "${todo.task}", status: "${todo.status}") {
             task
             status
           }
         }
       `;
       const { body } = await supertest(app)
         .post('/graphql')
         .send({ query })
         .set('Accept', 'application/json')
         .set('Authorization', `Bearer ${await authUserTest()}`);
       expect(body.data.todo).toMatchObject(todo);
     });
    
    로그인 후 복사
  • 모든 작업 검색

     it('should retrieve all tasks', async () => {
       const query = `
         query {
           todos {
             _id
             task
             status
           }
         }
       `;
       const { body } = await supertest(app)
         .post('/graphql')
         .send({ query })
         .set('Accept', 'application/json')
         .set('Authorization', `Bearer ${await authUserTest()}`);
       expect(body.data.todos).toBeInstanceOf(Array);
     });
    
    로그인 후 복사
  • 작업 업데이트

     it('should update a task', async () => {
       const todos = await Todo.find();
       const randomTodo = todos[Math.floor(Math.random() * todos.length)];
       const updatedTask = faker.lorem.words();
       const updatedStatus = faker.helpers.arrayElement(['pending', 'complete', 'in progress']);
       const query = `
         mutation {
           updateTodo(_id: "${randomTodo._id}", task: "${updatedTask}", status: "${updatedStatus}") {
             task
             status
           }
         }
       `;
       const { body } = await supertest(app)
         .post('/graphql')
         .send({ query })
         .set('Accept', 'application/json')
         .set('Authorization', `Bearer ${await authUserTest()}`);
       expect(body.data.updateTodo.task).toBe(updatedTask);
       expect(body.data.updateTodo.status).toBe(updatedStatus);
     });
    
    로그인 후 복사
  • 작업 삭제

     it('should delete a task', async () => {
       const todos = await Todo.find();
       const randomTodo = todos[Math.floor(Math.random() * todos.length)];
       const query = `
         mutation {
           deleteTodo(_id: "${randomTodo._id}") {
             _id
           }
         }
       `;
       const { body } = await supertest(app)
         .post('/graphql')
         .send({ query })
         .set('Accept', 'application/json')
         .set('Authorization', `Bearer ${await authUserTest()}`);
       expect(body.data.deleteTodo._id).toBe(randomTodo._id);
     });
    
    로그인 후 복사

테스트 실행

Jest를 사용하여 테스트를 실행하세요.

npm test
로그인 후 복사

이 명령은 모든 테스트 파일을 실행하고 결과에 대한 자세한 보고서를 제공합니다.

결론

Jest에서 헤더를 시뮬레이션하는 것이 어려웠기 때문에 프로세스를 크게 단순화한 SuperTest가 발견되었습니다. Jest와 함께 SuperTest를 활용함으로써 GraphQL API의 인증 및 CRUD 작업을 효과적으로 테스트하여 애플리케이션의 보안과 기능을 보장할 수 있었습니다. 이러한 학습 과정을 공유하면 공공 학습과 커뮤니티 중심의 문제 해결의 힘이 강조됩니다.

위 내용은 Jest와 SuperTest를 사용하여 GraphQL 애플리케이션 테스트의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿