Posts nestjs에서 mongodb-memory-server 이용하여 테스트 작성하기
Post
Cancel

nestjs에서 mongodb-memory-server 이용하여 테스트 작성하기

개요

  • 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를 추가해준다.
  • 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  

참고

This post is licensed under CC BY 4.0 by the author.