NestJs dan Jest: await request throws 404

Aug 24 2020

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

1 KimKern Aug 26 2020 at 01:55

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();