tsconfig.json
{
"compilerOptions": {
....
"paths": {
"@/*": ["src/*"],
"test/*": ["test/*"]
}
}
}
import path를 유용하게 잡기 위해 paths 옵션을 주었을때와 루트 디렉토리 경로에서 src폴더와 별개로 테스트 파일들을 한곳에 모아서 관리하고 싶었다.
프로젝트 구조
/src
/test
/test/unit
/test/e2e
/test/jest-e2e.json
Unit 테스트 파일 경로 설정하기
// 기존 package.json
...
"jest": {
"moduleFileExtensions": [
"js",
"json",
"ts"
],
"rootDir": "src",
"testRegex": ".*\\.spec\\.ts$",
"transform": {
"^.+\\.(t|j)s$": "ts-jest"
},
"collectCoverageFrom": [
"**/*.(t|j)s"
],
"coverageDirectory": "../coverage",
"testEnvironment": "node"
},
...
// 수정 package.json
"jest": {
"moduleFileExtensions": [
"js",
"json",
"ts"
],
"rootDir": ".",
"testRegex": ".*\\.spec\\.ts$",
"transform": {
"^.+\\.(t|j)s$": "ts-jest"
},
"collectCoverageFrom": [
"**/*.(t|j)s"
],
"coverageDirectory": "../coverage",
"testEnvironment": "node",
"moduleNameMapper": {
"^@/(.*)$": "<rootDir>/src/$1",
"^test/(.*)$": "<rootDir>/test/$1"
}
},
rooDir 경로가 수정 되었고, moduleNameMapper가 추가되었다.
Unit 테스트 정상 동작 테스트
// rootDir/test/unit/app.controller.spec.ts
import { AppController } from '@/controllers/app.controller';
import { AppService } from '@/providers/app.service';
import { Test, TestingModule } from '@nestjs/testing';
describe('AppController', () => {
let appController: AppController;
beforeEach(async () => {
const app: TestingModule = await Test.createTestingModule({
controllers: [AppController],
providers: [AppService],
}).compile();
appController = app.get<AppController>(AppController);
});
describe('root', () => {
it('should return "Hello World!"', () => {
expect(appController.getHello()).toBe('Hello World!');
});
});
});
e2e 테스트 경로 설정 해주기
// rootDir/test/jest-e2e.json
{
"moduleFileExtensions": ["js", "json", "ts"],
"rootDir": ".",
"testEnvironment": "node",
"testRegex": ".e2e-spec.ts$",
"transform": {
"^.+\\.(t|j)s$": "ts-jest"
},
"moduleNameMapper": {
"^@/(.*)$": "<rootDir>/../src/$1"
}
}
moduleNameMapper 경로가 살짝 다르다 그점에 유의하자
e2e 테스트 정상 동작 테스트