Skip to main content

Création d'objets fictifs pour abstraire les couches

Discussion avec Copilot peut aider à créer des objets fictifs que vous pouvez utiliser pour les tests unitaires.

Dans cet article

Lors de la création de tests unitaires, il est important de s’assurer qu’ils sont isolés et non en fonction des services externes. Pour ce faire, vous pouvez créer des objets fictifs qui abstraitnt des couches de votre application. Discussion avec Copilot peut vous aider à générer le code dont vous avez besoin pour créer ces objets fictifs.

Exemple de scénario

Imaginez un site web créé avec TypeScript qui affiche une liste de coureurs. Vous disposez d’un service qui extrait les exécuteurs d’une base de données et du code côté serveur qui utilise ce service. Vous voulez tester le code côté serveur, mais vous ne voulez pas faire d'appel à la base de données. Vous pouvez demander à Discussion avec Copilot de générer un objet fictif pour le service.

// SvelteKit example at +page.server.ts
import service from './service';

export async function load({ params }) {
  const runner = await service.getRunner(params.id);

  return {
    runner
  };
}

Exemple d’invite

Cet exemple suppose que vous utilisez vitest pour vos tests, mais fonctionne avec d’autres testeurs.

Copilot prompt
/tests Create a unit test to ensure the service is called correctly. Mock the service object.

Si vous disposez d'un test existant que vous souhaitez Copilot utiliser comme modèle, vous pouvez utiliser #file: path/to/test-file.js pour fournir le chemin d'accès au fichier et inclure cette information dans l'invite.

Exemple de réponse

Remarque

La réponse suivante est un exemple. Les réponses Discussion avec Copilot ne sont pas déterministes, vous pouvez donc obtenir une réponse différente de celle affichée ici.

Copilot fournit le plan qu'il va mettre en œuvre et le texte du code qui inclut les mocks.

import { describe, it, expect, vi, beforeEach } from 'vitest';
import { load } from './+page.server.ts';

// Mock the entire service module
vi.mock('./service', () => ({
  default: {
    getRunner: vi.fn()
  }
}));

// Import the mocked service
import service from './service';

describe('load function', () => {
  const mockRunner = {
    id: '123',
    name: 'Test Runner',
    status: 'active'
  };

  beforeEach(() => {
    // Reset mock before each test
    vi.resetAllMocks();

    // Setup default mock implementation
    (service.getRunner as any).mockResolvedValue(mockRunner);
  });

  it('should fetch runner with correct id', async () => {
    const params = { id: '123' };
    const result = await load({ params });

    expect(service.getRunner).toHaveBeenCalledWith('123');
    expect(service.getRunner).toHaveBeenCalledTimes(1);
    expect(result).toEqual({ runner: mockRunner });
  });
});

Pour approfondir