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. Du besitzt einen Dienst, der Runner aus einer Datenbank und den serverseitigen Code abruft, der diesen Dienst verwendet. 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
};
}
Beispiel für Prompt
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.
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
Note
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 einen Plan zum Implementieren bereit sowie den Codetext, in dem die Pseudoobjekte 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 });
});
});