Pengenalan
Sama ada anda berada dalam mod pembangunan dipacu ujian atau tidak, terdapat beberapa faedah berguna dalam ujian bertulis:
Mereka menyediakan jaring keselamatan yang membolehkan pembangun membuat perubahan dengan yakin, menambah ciri baharu, kod refactor mengetahui bahawa ujian akan mengesahkan kefungsian itu kekal utuh.
Sakitnya
Sesetengah daripada kita tidak diberkati dengan cpus mewah, dan itu tidak boleh mengecewakan terutamanya apabila berurusan dengan projek besar.
Baru-baru ini saya bekerja dalam aplikasi NestJS yang besar, dan saya hanya mahu menguji beberapa Pertanyaan TypeORM dan setiap kali saya mengubah suai saya perlu memuatkan keseluruhan projek. Fikirkan muka kecewa, itu adalah saya.
Penyelesaian
Ujian menulis adalah satu amalan yang baik, bukan? bagaimana jika saya boleh membangunkan lebih pantas dan secara tidak langsung mencipta ujian dan juga mengelakkan keperluan untuk mencipta olok-olok dan stubs? Ketika itu saya terfikir: Menguji terhadap pangkalan data sebenar.
Kod
Berikut ialah ujian:
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(); }); });
dan itulah repositori saya:
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 }) }
Ujian itu mestilah bukan kesempurnaan, tetapi saya memberi jaminan kepada anda:
Ia akan membantu pasukan pembangun mengelakkan menghantar pertanyaan yang rosak.
Jika sesetengah atribut atau perhubungan entiti berhenti wujud, seperti pelanggan.alamatkan pembina pertanyaan tidak akan memecahkan masa binaan. Tetapi ujian akan berlaku.?
Atas ialah kandungan terperinci Mencipta ujian dalam pangkalan data sebenar dengan NestJS, TypeORM dan PostgreSQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!