ホームページ  >  記事  >  ウェブフロントエンド  >  NestJS、TypeORM、PostgreSQL を使用して実際のデータベースでテストを作成する

NestJS、TypeORM、PostgreSQL を使用して実際のデータベースでテストを作成する

Barbara Streisand
Barbara Streisandオリジナル
2024-10-04 12:17:30132ブラウズ

Creating tests in real database with NestJS, TypeORM and PostgreSQL

イントロ
テスト駆動開発モードにいるかどうかに関係なく、テストの作成にはいくつかの便利な特典があります。
これらは、開発者が自信を持って変更、新機能の追加、コードのリファクタリングを行うことができるセーフティ ネットを提供します。これにより、テストによって機能が損なわれていないことが確認されることがわかります。

痛み
ハイエンドの CPU に恵まれていない人もいますが、大規模なプロジェクトを扱うときに特にイライラすることはありません。
最近、私は巨大な NestJS アプリで作業していて、いくつかの TypeORM クエリをテストしたかったのですが、変更するたびにプロジェクト全体をロードする必要がありました。イライラした顔を思い浮かべてください、それが私でした。

解決策
テストを書くのは良い習慣ですよね?より速く開発でき、間接的にテストを作成でき、モックやスタブを作成する必要もなくなるとしたらどうなるでしょうか?そのとき私は次のように考えました。実際のデータベースに対するテストではありません。

コード

テストは次のとおりです:


import * as dotenv from 'dotenv';
import { Test, TestingModule } from '@nestjs/testing';
import { INestApplication } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm'; 
dotenv.config();
describe('Queryes only test', () => {
    let app: INestApplication;
    let foodRepo: FoodRepository;

    beforeAll(async () => {
        const moduleFixture: TestingModule = await Test.createTestingModule({
            imports: [
                TypeOrmModule.forRootAsync({
                    useFactory: (configService: any) => ({
                        type: 'postgres',

                        host: process.env.TYPEORM_HOST,
                        port: Number(process.env.TYPEORM_PORT),
                        username: process.env.TYPEORM_USERNAME,
                        password: process.env.TYPEORM_PASSWORD,
                        database: process.env.TYPEORM_DATABASE,

                        entities: ['src/app/**/entities/*.entity.*'],
                        synchronize: false,
                        logging: true /* That will make the sql queryes appear in the console */
                    })
                }),
                TypeOrmModule.forFeature([FoodRepository])
            ]
        }).compile();

        app = moduleFixture.createNestApplication();
        await app.init();

        foodRepo = moduleFixture.get<FoodRepository>(FoodRepository);
    });

    jest.setTimeout(30000);

    it('Must find foods from regular customers', async () => {
        const foodsFromRegularCustomers = await foodRepo.findFoodsFromRegularCustomers().getMany();
        expect(Array.isArray(foodsFromRegularCustomers)).toBeTruthy();
    });

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



これが私のリポジトリです:


async findFoodsFromRegularCustomers() {
  const currentDate = new Date();
  const startOfWeek = new Date(currentDate.setDate(currentDate.getDate() - currentDate.getDay()));

  return this.createQueryBuilder('food')
    .innerJoin('food.customer', 'customer')
    .innerJoin('customer.orders', 'orders')
    .select([
      'customer.id', 
      'customer.name', 
      'customer.cpf', 
      'customer.address'
    ])
    .where('orders.createdAt >= :startOfWeek', { startOfWeek })
    .groupBy('customer.id')
    .having('COUNT(orders.id) > :minOrders', { minOrders: 10 })  
}



そのテストが完璧であるはずはありませんが、次のことは保証します。
これは、開発者チームが壊れたクエリを送信することを避けるのに役立ちます。

customer.address など、一部のエンティティ属性または関係が存在しなくなった場合、クエリ ビルダーはビルド時に中断されません。しかし、テストは行われます。?

以上がNestJS、TypeORM、PostgreSQL を使用して実際のデータベースでテストを作成するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。