NestJs dan Jest: await request throws 404
Saat ini saya mencoba untuk mendapatkan objek respons dari permintaan 'supertest'.
Jika saya memanggil get tanpa menunggu, saya mendapatkan httpCode 200, tetapi tanpa isi:
import { Test, TestingModule } from '@nestjs/testing';
import { AuthModule } from './auth.module';
import { INestApplication } from '@nestjs/common';
import * as request from 'supertest';
describe('AuthService', () => {
let app: INestApplication;
beforeAll(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [AuthModule]
}).compile();
app = module.createNestApplication();
await app.init();
});
it('should be defined', async () => {
const res = request(app.getHttpServer())
.get('/')
.expect(200);
});
afterAll(async () => {
app.close();
});
});
Jest memberi saya output berikut. Tapi saya tidak bisa merujuk ke res.body
AuthService
√ should be defined (5ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 15.961s, estimated 16s
Sekarang, jika saya mengubah panggilan get menjadi panggilan asinkron:
it('should be defined', async () => {
const res = await request(app.getHttpServer())
.get('/')
.expect(200);
});
Saya mendapatkan hasil tes yang gagal:
AuthService
× should be defined (35ms)
● AuthService › should be defined
expected 200 "OK", got 404 "Not Found"
at Test.Object.<anonymous>.Test._assertStatus (node_modules/supertest/lib/test.js:268:12)
at Test.Object.<anonymous>.Test._assertFunction (node_modules/supertest/lib/test.js:283:11)
at Test.Object.<anonymous>.Test.assert (node_modules/supertest/lib/test.js:173:18)
at Server.localAssert (node_modules/supertest/lib/test.js:131:12)
Test Suites: 1 failed, 1 total
Tests: 1 failed, 1 total
Snapshots: 0 total
Tanpa panggilan asinkron, saya tidak bisa merujuk ke tubuh. Tapi saya mendapatkan setiap 404, pada fungsi get yang sama. Baru saja digunakan menunggu panggilan async.
Jawaban
Pengujian tanpa asinkron hanya lolos karena pengujian selesai sebelum pernyataan Anda expect(200)berjalan. Dalam kedua kasus tersebut, memanggil /akan mengembalikan kesalahan 404.
Masalah utamanya adalah Anda mendeklarasikan modul sebagai penyedia, alih-alih mengimpornya:
await Test.createTestingModule({
// should be imports instead of providers
providers: [AuthModule]
})
Mengapa Anda menyiapkan AuthModuleaplikasi Anda secara terpisah dari aplikasi lainnya? Saya akan menyarankan Anda untuk menguji pengujian unit Anda secara terpisah (hanya menyertakan penyedia yang diuji, meniru yang lainnya) dan menguji seluruh aplikasi Anda dalam pengujian e2e (hanya mengejek bagian yang berbeda dari aplikasi Anda jika perlu, misalnya, panggilan API ke 3rd- layanan pesta); lihat utas ini untuk lebih jelasnya.
Saya sarankan untuk mengimpor sebagai AppModulegantinya:
const module: TestingModule = await Test.createTestingModule({
imports: [AppModule]
}).compile();