This page is also available in English.

Continue in English

Testing

TinyDI non ha un'API specifica per i test, e non ne ha bisogno. Registrazione e risoluzione sono semplici chiamate a metodo, quindi testare è normale TypeScript: costruisci un container, registra una finta implementazione al posto di quella reale, risolvi, verifica.

Un container nuovo per ogni test

L'istanza in cache di un Singleton vive sul Container da cui è stata costruita, non in una variabile globale. Creare un nuovo Container nel setup di ogni test basta a garantire che nessuno stato sopravviva tra un test e l'altro — non esiste un passaggio reset() da ricordare.

ts
import { Container, createToken } from 'tinydi-container';
 
interface IMailService {
  send(to: string, body: string): Promise<void>;
}
 
const MailServiceToken = createToken<IMailService>('MailService');
 
class FakeMailService implements IMailService {
  sent: { to: string; body: string }[] = [];
  async send(to: string, body: string): Promise<void> {
    this.sent.push({ to, body });
  }
}
 
let container: Container;
let mail: FakeMailService;
 
beforeEach(() => {
  container = new Container();
  mail = new FakeMailService();
  container.registerInstance(MailServiceToken, mail);
});
 
test('invia una email di benvenuto alla registrazione', async () => {
  await onSignup(container, 'user@example.com');
  expect(mail.sent).toHaveLength(1);
});

Nessuna libreria di mocking necessaria

Una finta implementazione è solo una classe o un oggetto che implementa la stessa interfaccia — TypeScript la verifica strutturalmente in fase di compilazione, esattamente come l'implementazione reale. Non c'è nulla da importare oltre a tinydi-container stesso.

Sostituire una finta implementazione a metà test

remove() esiste apposta per questo: registrare un token già registrato lancia RegistrationError, di proposito, quindi chiama remove() prima di ri-registrarlo con una finta implementazione diversa.

ts
// Più avanti nello stesso file di test, un altro test ha bisogno che
// l'implementazione reale fallisca, per verificare il percorso di errore:
container.remove(MailServiceToken);
container.registerInstance(MailServiceToken, new FailingMailService());

Cosa non copre

TinyDI non fornisce spy, conteggio delle chiamate o generazione automatica di mock. Abbinalo alla libreria di asserzioni del tuo test runner (l'expect di Vitest, l'expect di Jest, o simili) per quello — una finta implementazione registrata con registerInstance è un oggetto semplice, quindi qualsiasi libreria di asserzioni funziona su di essa senza modifiche.

per navigare per selezionare Esc per chiudere