typescript - Nest.js Fastify δοκιμές TypeError: app.address δεν είναι συνάρτηση


Όταν εκτελώ δοκιμές e2e στο Nest.js με FastifyAdapter, λαμβάνω το ακόλουθο σφάλμα κατά την εκτέλεση των δοκιμών:

TypeError: app.address is not a function

  54 | 
  55 |     return request(app.getHttpServer())
> 56 |       .post('/authentication/register')
     |        ^
  57 |       .send(payload)
  58 |       .expect(400);
  59 |   });

Η σύνθεση είναι ως εξής:

   beforeAll(async () => {
    const module = await Test.createTestingModule({
      imports: [AuthenticationModule],
    })
      .overrideProvider(UserRepository)
      .useValue(userRepository)
      .compile();

    app = module.createNestApplication(new FastifyAdapter());
    await app.init();
  });

  it(`/POST register - should succeed for valid info`, () => {
    const payload = { email: '[email ', password: '1234' };

    return request(app.getHttpServer())
      .post('/authentication/register')
      .send(payload)
      .expect({})
      .expect(201);
  });

Όταν δεν χρησιμοποιείται ο FastifyAdapter, δεν υπάρχει τέτοιο σφάλμα. Ο λόγος χρήσης του adapter είναι λόγω του προσθέτου fastify-cookie που επιτρέπει την επεξεργασία των cookies μέσω των αιτήσεων.

Απλώς να σημειώσω ότι για αυτήν την επίδειξη πήγα χωρίς το πρόσθετο cookie στο beforeAll που θα ήταν:

const fastifyAdapter = new FastifyAdapter();
fastifyAdapter.register(fastifyCookie);

Απάντηση #1

Μου έχει λείψει η τεκμηρίωση σχετικά με τις δοκιμές Nest.js για fastify, η οποία μπορεί να βρεθεί στον πηγαίο κώδικα του Nest.js αλλά όχι στην τεκμηρίωση του ιστότοπου. Όταν χρησιμοποιούμε fastify, χρειάζεται να χρησιμοποιούμε τις μεθόδους δοκιμών από την τεκμηρίωσή τους. Το παρακάτω παράδειγμα λειτουργεί σωστά:

beforeAll(async () => {
    const fastifyAdapter = new FastifyAdapter();
    fastifyAdapter.register(fastifyCookie);

    const module = await Test.createTestingModule({
      imports: [AuthenticationModule],
    })
      .overrideProvider(UserRepository)
      .useValue(userRepository)
      .compile();

    app = module.createNestApplication(fastifyAdapter);
    await app.init();
});

it(`/POST register - should succeed for valid info`, () => {
    return app
      .inject({
        method:  'POST',
        url:     '/authentication/register',
        payload: { email: '[email ', password: '1234' },
      })
      .then(({ statusCode, payload }) => {
        expect(payload).toEqual('');
        expect(statusCode).toEqual(201);
      });
});

afterAll(async () => {
    await app.close();
});