メモリにMongoを用いたNESTJSのユニットテスト


あなたのNSTEJSプロジェクトですでにインストールされて、構成されたmongooseを仮定します.
テストをするために、SQUID APIを作成します.APIは、ランダムなイカGIFを提供するときに呼び出されます.
demo repoで実際の実装を見ることができます.
データベースと対話するコードの書き込みテストはかなり痛いです.
テストデータベースを作成し、その後にデータベースを削除する必要があります.
OR
テストの後にきれいにするためにコードのトンを書いて、デバッグするために、あなたは終わります..
今日はあなたの悲惨の終わりです!
私は、あなたにテストのトラブルを保存するために、ここにいます.NestJS、モンゴースとMongoDB .ごめんなさい
まず、プロジェクトに新しい開発パッケージを追加する必要があります.(この記事の最後に提供されたGithubリポジトリへのリンク)
npm i --save-dev mongodb-memory-server 
クール、我々はすぐにメモリにモンゴーデーモンを産むことができます!どのように素晴らしいですか?
私は怠惰なBRATであるので、私はメモリ内Mongodブートストラッピングコードで書き直したくありません.
小さなテストutilsファイルを書きましょう.
import { MongooseModule, MongooseModuleOptions } from '@nestjs/mongoose';
import { MongoMemoryServer } from 'mongodb-memory-server';

let mongod: MongoMemoryServer;

export const rootMongooseTestModule = (options: MongooseModuleOptions = {}) => MongooseModule.forRootAsync({
  useFactory: async () => {
    mongod = new MongoMemoryServer();
    const mongoUri = await mongod.getUri();
    return {
      uri: mongoUri,
      ...options,
    }
  },
});

export const closeInMongodConnection = async () => {
  if (mongod) await mongod.stop();
}
優れた、メモリプラグでプレイMongoDBデーモン!
その悪い男の子を我々のサービスとコントローラテストに移しましょう.afterAll関数で接続を閉じるのを忘れないでください.
import { Test, TestingModule } from '@nestjs/testing';
import { MongooseModule } from '@nestjs/mongoose';

import { SquidService } from './squid.service';
import { closeInMongodConnection, rootMongooseTestModule } from '../test-utils/mongo/MongooseTestModule';
import { SquidSchema } from './model/squid.schema';

describe('SquidService', () => {
  let service: SquidService;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      imports: [
        rootMongooseTestModule(),
        MongooseModule.forFeature([{ name: 'Squid', schema: SquidSchema }]),
      ],
      providers: [SquidService],
    }).compile();

    service = module.get<SquidService>(SquidService);
  });

  it('should be defined', () => {
    expect(service).toBeDefined();
  });

  /**
    Write meaningful test
  **/

  afterAll(async () => {
    await closeInMongodConnection();
  });
});
とVoila!
あなたは全員集合です.
あなたが書いている素晴らしいコードをテストするために戻ってください!
次回はNESTJSのエンドツーエンドテストのケースを扱います.

ソース


NestjJS
NestJS techniques mongodb
mongod-in-memory
The issue that saved me