Einführung
Unabhängig davon, ob Sie sich im testgetriebenen Entwicklungsmodus befinden oder nicht, gibt es beim Schreiben von Tests einige nützliche Vorteile:
Sie bieten ein Sicherheitsnetz, das es Entwicklern ermöglicht, sicher Änderungen vorzunehmen, neue Funktionen hinzuzufügen und Code umzugestalten, mit der Gewissheit, dass die Tests sicherstellen, dass die Funktionalität intakt bleibt.
Der Schmerz
Einige von uns sind nicht mit High-End-CPUs gesegnet, und das kann bei großen Projekten nicht besonders frustrierend sein.
Kürzlich habe ich an einer riesigen NestJS-App gearbeitet und wollte nur einige TypeORM-Abfragen testen. Bei jeder Änderung musste ich das gesamte Projekt laden. Denken Sie an ein frustriertes Gesicht, das war ich.
Lösung
Tests zu schreiben ist eine gute Übung, oder? Was wäre, wenn ich schneller entwickeln und indirekt Tests erstellen könnte und auch die Notwendigkeit vermeiden könnte, Mocks und Stubs zu erstellen? Da dachte ich: Tests nicht mit der echten Datenbank.
Code
Hier sind die Tests:
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(); }); });
und das ist mein Repository:
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 }) }
Dieser Test muss nicht die Perfektion sein, aber ich versichere Ihnen:
Dies wird dem Entwicklerteam helfen, das Senden fehlerhafter Abfragen zu vermeiden.
Wenn ein Entitätsattribut oder eine Beziehung nicht mehr vorhanden ist, wie z. B. customer.address, wird der Abfrage-Builder in der Build-Zeit nicht unterbrochen. Aber die Tests werden.?
Das obige ist der detaillierte Inhalt vonErstellen von Tests in einer echten Datenbank mit NestJS, TypeORM und PostgreSQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!