개요
- nestjs에서mongodb-memory-server를 이용하여
메모리용 mongodb 인스턴스를 생성하고
유닛테스트를 작성한다.
설치
1
npm install -D mongodb-memory-server
test 용 mongodb 설정
- test/momory-mongodb-setup.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
import { MongoMemoryServer } from "mongodb-memory-server"; let mongo: MongoMemoryServer; export const initTestMongodb = async () => { if (!mongo) { mongo = await MongoMemoryServer.create(); } }; export const getTestMongodbUri = () => { return mongo.getUri(); }; export const disconnectTestMongodb = async () => { if (mongo) { await mongo.stop(); } };
절대경로 alias 추가
- 설명
- .spec.ts 파일에서 /test와 /src에 접근하기 쉽도록
절대경로 alias를 추가해준다.
- .spec.ts 파일에서 /test와 /src에 접근하기 쉽도록
- tsconfig.json
1 2 3 4 5 6 7 8 9 10
{ "compilerOptions": { "baseUrl": "./", "paths": { "@test/*": ["test/*"], "@src/*": ["src/*"] } ... } }
- package.json
1 2 3 4 5 6 7 8 9 10 11
{ ... "jset": { ... "rootDir": "./", "moduleNameMapper": { "@test/(.+)$": "<rootDir>/test/$1", "@src/(.+)$": "<rootDir>/src/$1" } } }
테스트 코드 작성
- .spec.ts 파일을 생성하고 테스트 코드를 작성하면 된다.
ex) post.repository.ts -> post.repository.spec.ts - post/post.repository.spec.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
import { PostRepository } from "@src/post/post.repository"; describe("PostRepository", () => { let postRepository: PostRepository; let newPost: Post; // 최초 유닛 테스트 시작 전 한 번만 실행 beforeAll(async () => { await initTestMongodb(); const testMongodbUri = getTestMongodbUri(); const module: TestingModule = await Test.createTestingModule({ imports: [ MongooseModule.forRoot(testMongodbUri), MongooseModule.forFeature([ { name: POST_COLLECTION_NAME, schema: PostSchema }, ]), ], providers: [PostRepository], }).compile(); postRepository = module.get<PostRepository>(PostRepository); // 새 포스트 생성 const userId = "kim"; const post = new Post( userId, "hello my-description", ); newPost = await postRepository.createPost(post); }); // 모든 유닛 테스트 종료 후 한 번만 실행 afterAll(async () => { await disconnectTestMongodb(); }); it("should be defined", () => { expect(postRepository).toBeDefined(); }); describe("findOne", () => { it("existsById", async () => { expect(newPost).not.toEqual(undefined); const exists = await postRepository.existsById(newPost._id.toString()); expect(exists).toEqual(true); }); }); });
테스트 실행
1
2
3
4
5
# 한 번 테스트 실행
npm run test
# 저장 시 마다 테스트 실행
npm run test:watch