typescript - Vitest + FastifyAutoload=FastifyError: Το plugin πρέπει να είναι συνάρτηση ή υπόσχεση. Λήφθηκε: 'αντικείμενο'


Έχω μια εφαρμογή που τρέχει σε Fastify ("fastify": "^4.26.0"), η οποία λειτουργεί άψογα υπό κανονικές συνθήκες, χωρίς να παρουσιάζει κανένα πρόβλημα. Ωστόσο, κατά την προσπάθεια υλοποίησης unit testing με Vitest, αντιμετωπίζω ένα επίμονο πρόβλημα όπου κάθε τεστ αποτυγχάνει, ανεξαρτήτως της απλότητάς του. Κατά τη διαδικασία εντοπισμού σφαλμάτων, ανακάλυψα ότι αν σχολιάσω τις ακόλουθες γραμμές στο αρχείο app.ts μου, τα τεστ εκτελούνται με επιτυχία:

  // This loads all plugins defined in plugins
  // those should be support plugins that are reused
  // through your application
  void app.register(AutoLoad, {
    dir: join(__dirname, 'plugins'),
    options: Object.assign({}, opts),
  })

Αναζητώντας μια λύση, βρήκα αυτό το ζήτημα στο GitHub, το οποίο, αν και δεν είναι ακριβώς το ίδιο με το δικό μου ζήτημα, με οδήγησε σε μια προσωρινή λύση. Κατάφερα να εφαρμόσω την ακόλουθη ρύθμιση στο αρχείο μου vitest.config.mts:

import { defineConfig } from 'vitest/config'

export default defineConfig({
    test: {
        include: ["test/**/*.test.ts"],
        silent: false,
        server: {
            deps: {
                inline: ["@fastify/autoload"],
            },
        },
    },
});

Με αυτή τη ρύθμιση, μπόρεσα να τρέξω τις δοκιμές χωρίς κανένα πρόβλημα για μερικούς μήνες. Ωστόσο, τώρα δεν μπορώ να ξανατρέξω τις δοκιμές, αντιμετωπίζοντας συνεχώς το ακόλουθο σφάλμα:

 FAIL  test/main.test.ts > App > should start the app
 FastifyError: Plugin must be a function or a promise. Received: 'object'
 ❯ validatePlugin node_modules/avvio/lib/validate-plugin.js:19:13
 ❯ Boot._addPlugin node_modules/avvio/boot.js:166:3
 ❯ Boot.use node_modules/avvio/boot.js:139:25
 ❯ Object.server.<computed> [as register] node_modules/avvio/boot.js:204:14
 ❯ registerPlugin node_modules/@fastify/autoload/index.js:342:11
    340|   }
    341| 
    342|   fastify.register(plugin, options)
       |           ^
    343| 
    344|   meta.registered = true
 ❯ registerAllPlugins node_modules/@fastify/autoload/index.js:112:19
 ❯ autoload node_modules/@fastify/autoload/index.js:92:7

Απάντηση #1

Όταν χρησιμοποιείτε autoload, δεν πρέπει ποτέ να υπάρχει μη-προσθετικό αρχείο μέσα στο φάκελο των προσθετικών που φορτώνεται από το autoload. Το Vitest δεν θα λειτουργήσει αν συμβεί αυτό.