Beim Erstellen von Komponententests sollte sichergestellt werden, dass sie isoliert und nicht von externen Diensten abhängig sind. Dies erreichst du durch Erstellen von Pseudoobjekten, die die Schichten deiner Anwendung abstrahieren. Copilot-Chat kann dir beim Generieren des Codes helfen, den du zum Erstellen von Pseudoobjekten benötigst.
Beispielszenario
Stelle dir eine Website vor, die mit TypeScript erstellt wurde und eine Runnerliste anzeigt. Sie haben einen Dienst, der die Runner aus einer Datenbank abruft, und den serverseitigen Code, der diesen Dienst nutzt. Du möchtest den serverseitigen Code testen, aber keinen Aufruf an die Datenbank durchführen. Du kannst Copilot-Chat dazu auffordern, ein Pseudoobjekt für den Dienst zu generieren.
// SvelteKit example at +page.server.ts
import service from './service';
export async function load({ params }) {
const runner = await service.getRunner(params.id);
return {
runner
};
}
Beispielprompt
In diesem Beispiel wird davon ausgegangen, dass du für deine Tests vitest verwendest, aber mit anderen Testrunnern arbeitest.
/tests Create a unit test to ensure the service is called correctly. Mock the service object.
// SvelteKit example at +page.server.ts
import service from './service';
export async function load({ params }) {
const runner = await service.getRunner(params.id);
return {
runner
};
}
/tests Create a unit test to ensure the service is called correctly. Mock the service object.
/tests Create a unit test to ensure the service is called correctly. Mock the service object.
Wenn Copilot einen vorhandenen Test als Modell verwenden soll, kannst du #file: path/to/test-file.js zum Angeben des Dateipfads nutzen und diese Informationen in den Prompt schreiben.
Beispielantwort
Hinweis
Die folgende Antwort ist ein Beispiel. Da die Copilot-Chat-Antworten nicht deterministisch sind, erhältst du möglicherweise eine andere Antwort als die hier beschriebene.
Copilot stellt den Plan bereit, den es implementieren wird, sowie den Codetext, in dem die Mock-Objekte enthalten sind.
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 });
});
});