단위 테스트를 만들 때 외부 서비스에 따라 격리되지 않도록 하는 것이 중요합니다. 이를 달성하는 한 가지 방법은 애플리케이션의 계층을 추상화하는 모의 개체를 만드는 것입니다. Copilot Chat는 이러한 모의 개체를 만드는 데 필요한 코드를 생성하는 데 도움이 될 수 있습니다.
예제 시나리오
실행기 목록을 표시하는 TypeScript로 빌드된 웹 사이트를 상상해 보세요. 데이터베이스에서 실행기를 가져오는 서비스와 이 서비스를 사용하는 서버 쪽 코드가 있습니다. 서버 쪽 코드를 테스트하려고 하지만 데이터베이스를 호출하고 싶지는 않습니다. 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 });
});
});