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