Skip to main content

Создание макетных объектов для абстрактных слоев

Copilot Chat может помочь в создании макетных объектов, которые можно использовать для модульных тестов.

При создании модульных тестов важно убедиться, что они изолированы и не зависят от внешних служб. Одним из способов этого является создание макетных объектов, которые абстрагируют слои приложения. Copilot Chat поможет создать код, который необходимо создать.

Пример сценария

Представьте себе веб-сайт, созданный с помощью TypeScript, который отображает список runners. У вас есть служба, которая извлекает runners из базы данных и серверный код, который использует эту службу. Вы хотите протестировать серверный код, но не хотите вызывать базу данных. Вы можете попросить Copilot Chat создать объект макета для службы.

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

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

  return {
    runner
  };
}

Пример запроса

В этом примере предполагается, что вы используете vitest для тестов, но будет работать с другими средствами выполнения тестов.

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

Если у вас есть существующий тест, который вы хотите Copilot использовать в качестве модели, можно использовать #file: path/to/test-file.js для предоставления пути к файлу и включить эти сведения в запрос.

Пример отклика

Note

Следующий ответ является примером. Ответы Copilot Chat являются недетерминированными, поэтому вы можете получить другой ответ, показанный здесь.

Copilot предоставляет план, который он реализует, и текст кода, включающий макеты.

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

Дополнительные материалы