본문으로 바로가기
제품데스크톱 도구TASTECAD도면 확인TASTEFILES파일 관리TASTEFTP파일 전송TASTESSH원격 작업공간TASTEZIP압축과 해제개발 도구TASTECODERust 통합 개발 환경TASTESTUDIO통합 개발·테스트 환경TASTEETL데이터 통합(ETL)서버TASTEREMOTE원격 데스크톱 서버TASTEGEO공간정보 서버TASTEMAIL메일 작업공간시작하기다운로드문서구매모든 제품
마켓플레이스
소식
개발소식오늘의 개발 소식개발 문서프로그래밍 언어RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron알고리즘알고리즘 기초알고리즘 핵심알고리즘 심화실무 알고리즘
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스커뮤니티 안내
협업기술 전수홈페이지 구축데스크톱 앱 구축릴리스·결제 파이프라인판매 파트너문의
서비스원격 데스크톱설치 패키지 커스텀
TASTEDEV
제품

데스크톱 도구

TASTECAD복잡한 도면을 가볍게 열다TASTEFILES필요한 파일만, 가장 빠르게TASTEFTP파일이 오가는 가장 단정한 길TASTESSH서버와 나 사이, 더 단단한 연결TASTEZIP더 빠르게 묶고, 더 안전하게 풀다

개발 도구

TASTECODERust 앱을 편집 · 빌드 · 디버깅 · 테스트까지 한 창에서TASTESTUDIO편집부터 원격 테스트와 승인 기반 AI 수정까지TASTEETL값을 보며 데이터를 옮깁니다

서버

TASTEREMOTE우리 회사 서버로 운영하는 원격 데스크톱TASTEGEOGeoServer 호환 공간정보 서버를 Rust로 다시 세웁니다TASTEMAIL메일의 주도권을 다시 내 손에

시작하기

다운로드모든 제품 최신 판문서제품 사용법구매구독 · 영구 라이선스모든 제품모든 제품 한눈에
모든 제품
마켓플레이스소식
개발

소식

오늘의 개발 소식언어 · 프레임워크 · GitHub · AI 공식 발표개발 문서언어 · 프레임워크 · 알고리즘 안내서

프로그래밍 언어

RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart

프레임워크

프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular
서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express
앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron

알고리즘

알고리즘 기초복잡도 분석 · 정렬 · 탐색 · 기본 자료구조 · 트리와 힙알고리즘 핵심그래프 탐색 · 최단 경로와 최소 신장 트리 · 동적 계획법 · 탐욕 알고리즘 · 분할 정복 · 백트래킹알고리즘 심화문자열 알고리즘 · 수학과 정수론 · 비트 연산 · 구간 트리 · 유니온 파인드실무 알고리즘코딩 면접 풀이 전략 · LRU 캐시 · 레이트 리미터 · 일관된 해시
개발 문서 전체 보기
커뮤니티
프로젝트빌더와 작업 발견개발 로그결정과 시행착오프롬프트재사용 가능한 지시AI 도구 이슈Claude · Codex · Gemini 문제와 우회법쇼케이스완성된 결과커뮤니티 안내공개하고 함께 만드는 방식
협업
기술 전수Rust·egui 네이티브 앱 만들기홈페이지 구축10개 언어, 계정, 문서·다운로드데스크톱 앱 구축Rust·egui, WebView 없이릴리스·결제 파이프라인서명 · MSI·deb·rpm·AppImage · 해시판매 파트너소개하고 결제액의 30% 받기문의구축 · 제휴 · 투자 문의
서비스
원격 데스크톱브라우저로 내 컴퓨터에 접속설치 패키지 커스텀필요한 기능만, 설정은 미리
구매
KO
한국어EnglishDeutschEspañolFrançaisItalianoPortuguês (Brasil)日本語简体中文繁體中文
로그인
로그인
TASTEDEV

작은 도구부터, 더 좋은 개발까지.

support@tastedev.netTASTEDEV 후원하기
제품제품군구매문서다운로드마켓플레이스고객 지원
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스
정책개인정보처리방침이용약관구독 약관환불 정책커뮤니티 운영 정책
계정로그인가입하기
방문자
오늘
012345678901234567890123456789012345678901234567890123456789
어제
012345678901234567890123456789012345678901234567890123456789
누적 조회
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
상호
지엑스소프트
대표자
최영구
사업자등록번호
853-44-00368
주소
인천광역시 미추홀구 경인로 351 9층 V24
전화
+82-10-4404-1523
이메일
whitecalvin@tastedev.net
개인정보 보호책임자
최영구

© 2026 TASTEDEV제품 정보는 현재 검증된 개발 소스를 기준으로 합니다.출시·고도화 중

NestJS · Express 문서
NestJS · Express
NestJS · Express 시작하기프로젝트 구조핵심 개념검증 · 설정 · 데이터베이스테스트배포
토론

NestJS · Express 안내서 · 5/6

테스트

nest new로 만든 프로젝트에는 Jest와 Supertest, Nest의 테스트 도구 @nestjs/testing이 이미 설정되어 있습니다. 이 장에서는 서비스와 컨트롤러의 단위 테스트, 애플리케이션 전체를 띄우는 e2e 테스트, 그리고 Express 앱을 Supertest로 검사하는 방법을 다룹니다.

테스트 실행하기

단위 테스트는 src 안의 *.spec.ts 파일이고, e2e 테스트는 test 폴더의 *.e2e-spec.ts 파일입니다. e2e 테스트는 test/jest-e2e.json이라는 별도 Jest 설정을 씁니다.

npm run test         # 단위 테스트
npm run test:watch   # 파일이 바뀔 때마다 다시 실행
npm run test:cov     # 커버리지 보고서
npm run test:e2e     # e2e 테스트

서비스 단위 테스트

의존성이 없는 서비스는 평범한 클래스처럼 new로 만들어 테스트해도 됩니다. 하지만 의존성이 있다면 Nest의 Test.createTestingModule로 테스트용 모듈을 만들고, 실제 프로바이더 대신 가짜 객체를 넣는 것이 편합니다.

// src/users/users.service.spec.ts
import { Test } from "@nestjs/testing";
import { getRepositoryToken } from "@nestjs/typeorm";
import { User } from "./entities/user.entity";
import { UsersService } from "./users.service";

describe("UsersService", () => {
  let service: UsersService;
  const repository = { find: jest.fn(), create: jest.fn(), save: jest.fn() };

  beforeEach(async () => {
    const moduleRef = await Test.createTestingModule({
      providers: [UsersService, { provide: getRepositoryToken(User), useValue: repository }],
    }).compile();

    service = moduleRef.get(UsersService);
  });

  it("returns every user", async () => {
    repository.find.mockResolvedValue([{ id: 1, name: "Kim" }]);
    await expect(service.findAll()).resolves.toHaveLength(1);
  });
});

getRepositoryToken(User)는 @InjectRepository(User)가 찾는 주입 토큰입니다. 이렇게 하면 데이터베이스 없이 서비스의 논리만 검사할 수 있습니다.

컨트롤러 단위 테스트

컨트롤러를 테스트할 때는 서비스를 가짜로 바꿉니다. 모듈 전체를 가져온 뒤 일부만 바꾸고 싶다면 overrideProvider를 씁니다.

// src/users/users.controller.spec.ts
import { Test } from "@nestjs/testing";
import { UsersController } from "./users.controller";
import { UsersService } from "./users.service";

describe("UsersController", () => {
  it("delegates to the service", async () => {
    const usersService = { findAll: jest.fn().mockResolvedValue([]) };

    const moduleRef = await Test.createTestingModule({
      controllers: [UsersController],
      providers: [UsersService],
    })
      .overrideProvider(UsersService)
      .useValue(usersService)
      .compile();

    const controller = moduleRef.get(UsersController);
    await controller.findAll();
    expect(usersService.findAll).toHaveBeenCalled();
  });
});

Supertest로 e2e 테스트하기

e2e 테스트는 실제 모듈로 애플리케이션을 만들고, Supertest로 HTTP 요청을 보내 응답을 검사합니다. main.ts에서 등록한 전역 파이프 같은 설정은 테스트용 앱에도 똑같이 적용해야 합니다.

// test/users.e2e-spec.ts
import { INestApplication, ValidationPipe } from "@nestjs/common";
import { Test } from "@nestjs/testing";
import request from "supertest";
import { AppModule } from "../src/app.module";

describe("Users (e2e)", () => {
  let app: INestApplication;

  beforeAll(async () => {
    const moduleRef = await Test.createTestingModule({ imports: [AppModule] }).compile();
    app = moduleRef.createNestApplication();
    app.useGlobalPipes(new ValidationPipe({ whitelist: true }));
    await app.init();
  });

  afterAll(async () => {
    await app.close();
  });

  it("rejects an invalid body", () => {
    return request(app.getHttpServer()).post("/users").send({ name: "" }).expect(400);
  });
});

app.getHttpServer()는 Nest가 감싼 실제 HTTP 서버를 돌려주므로 포트를 따로 열 필요가 없습니다. 데이터베이스를 쓰는 e2e 테스트는 테스트 전용 데이터베이스를 두거나, Testcontainers 같은 도구로 테스트 때마다 컨테이너를 띄워 운영 데이터와 분리합니다.

Express 앱 테스트하기

Express도 같은 방식입니다. 앞 장처럼 app.js가 앱을 내보내기만 하면, Supertest가 그 앱에 직접 요청을 보냅니다.

npm i -D jest supertest
// test/users.test.js
const request = require("supertest");
const app = require("../src/app");

test("GET /users/1 returns the user", async () => {
  const response = await request(app).get("/users/1").expect(200);
  expect(response.body.id).toBe("1");
});

Node.js에 들어 있는 테스트 실행기 node:test와 Supertest를 함께 써도 됩니다.

정리

  • Nest 프로젝트는 Jest(단위 테스트)와 Supertest(e2e 테스트)가 처음부터 설정되어 있습니다.
  • Test.createTestingModule로 테스트 모듈을 만들고 useValue · overrideProvider로 의존성을 가짜로 바꿉니다.
  • e2e 테스트는 createNestApplication()과 app.getHttpServer()로 실제 요청 흐름을 검사하며, 전역 설정도 똑같이 적용합니다.
  • Express는 앱과 listen을 분리해 두면 Supertest로 쉽게 테스트할 수 있습니다.
이 장에 대해 질문이 있나요?
이전 장검증 · 설정 · 데이터베이스다음 장배포

댓글 0개

인기 댓글순최신순

로그인 · 로그인하면 댓글을 남길 수 있습니다.