slogan3

Code Review Gericht op Testbaarheid en Unit Testing

description

Met deze prompt krijg je concrete handvatten om je code beter testbaar te maken, wat leidt tot minder bugs en eenvoudigere onderhoudbaarheid. Door gerichte feedback op unit tests en teststrategieën helpt het je om een robuustere en betrouwbaardere codebase op te bouwen dan standaard code reviews die vooral op stijl of performance focussen.

prompt

Analyseer mijn code met de focus op testbaarheid en unit testing. Geef suggesties om mijn code beter testbaar te maken, inclusief aanbevelinge ...

try_prompt

generate_helper
disclaimerOnPageApi

ai_answers

provider: openai
model: gpt-4.1-nano
De code die je hebt gedeeld is vrij eenvoudig en lijkt goed testbaar omdat het een pure functie is zonder externe afhankelijkheden. Hier zijn enkele punten en suggesties met betrekking tot testbaarheid en unit testing: **Sterke punten:** - **Pure functie:** De functie `calculateDiscount` is puur, omdat het geen externe staten of bijwerkingen heeft. Dit maakt het gemakkelijk te testen. - **Duidelijke input en output:** Het gebruikt duidelijke parameters (`price` en `user`) en retourneert een resultaat, wat het testen eenvoudig maakt. **Verbeteringen om de testbaarheid te vergroten:** - **Typecontrole en inputvalidatie:** Overweeg het toevoegen van checks op de invoer (bijvoorbeeld of `price` een getal is en of `user` het juiste object bevat). Hierdoor kunnen tests ook de foutafhandeling dekken. - **Gebruik van interfaces of types:** Als je in TypeScript werkt, kun je het type van `user` expliciet maken en zorgen dat het duidelijk is wat de eigenschappen zijn. In JavaScript kun je dat documenteren of via JSDoc toevoegen. **Aanbevelingen voor het schrijven van effectieve unit tests:** - **Test verschillende scenario's:** - Wanneer `user.isPremium` `true` is. - Wanneer `user.isPremium` `false` is of niet bestaat. - Variaties in `price` (bijvoorbeeld negatieve waarden, nul, grote waarden). - **Gebruik mocking of dummy data:** Maak eenvoudige `user` objecten voor tests. - **Test randgevallen en foutscenario's:** Bijvoorbeeld wat er gebeurt als `user` geen `isPremium` eigenschap heeft. **TDD principes toepassen:** - Begin met het schrijven van tests voor de gewenste functionaliteit voordat je de implementatie schrijft. - Bijvoorbeeld: schrijf een test dat `calculateDiscount(100, {isPremium: true})` 80 oplevert. - Vervolgens implementeer net genoeg code om die test te laten slagen. - Breid uit met meer tests en functionaliteit volgens TDD-cyclus. **Kort samengevat:** - De functie is al goed testbaar vanwege haar eenvoud. - Voeg indien nodig typecontroles toe. - Schrijf uitgebreide tests voor verschillende scenario's. - Pas TDD toe door eerst tests te schrijven en vervolgens de implementatie. **Voorbeeld van een uitgebreide test in pseudocode:** ```javascript // Test voor premium gebruiker assert(calculateDiscount(100, {isPremium: true}) === 80); // Test voor niet-premium gebruiker assert(calculateDiscount(100, {isPremium: false}) === 100); // Test zonder isPremium eigenschap assert(calculateDiscount(100, {}) === 100); // Test met negatieve prijs assert(calculateDiscount(-50, {isPremium: true}) === -40); ``` Door deze aanpak wordt je code robuuster, beter gedekt door tests en eenvoudiger te onderhouden.
provider: deepseek
model: deepseek-chat
Hier is een analyse van je code met focus op testbaarheid en suggesties voor verbetering: ## Huidige problemen met testbaarheid: 1. **Directe afhankelijkheid van user-object structuur** - De code verwacht specifiek een `isPremium` property 2. **Geen dependency injection** - Vaste business logic in de functie 3. **Moeilijk om edge cases te testen** door directe property access ## Verbeterde code: ```javascript function calculateDiscount(price, isPremiumUser) { if (typeof price !== 'number' || price < 0) { throw new Error('Ongeldige prijs'); } if (typeof isPremiumUser !== 'boolean') { throw new Error('Ongeldige gebruikerstatus'); } return isPremiumUser ? price * 0.8 : price; } ``` ## Unit test voorbeelden (gebruik Jest of Mocha): ```javascript describe('calculateDiscount', () => { test('geeft 20% korting voor premium gebruikers', () => { expect(calculateDiscount(100, true)).toBe(80); }); test('geeft geen korting voor gewone gebruikers', () => { expect(calculateDiscount(100, false)).toBe(100); }); test('werpt fout bij ongeldige prijs', () => { expect(() => calculateDiscount(-50, true)).toThrow('Ongeldige prijs'); }); test('werpt fout bij ongeldige gebruikerstatus', () => { expect(() => calculateDiscount(100, 'invalid')).toThrow('Ongeldige gebruikerstatus'); }); }); ``` ## TDD-aanbevelingen: 1. **Schrijf eerst tests** - Definieer verwacht gedrag voordat je code schrijft 2. **Kleine stappen** - Begin met eenvoudige cases (bijv. gewone gebruiker) 3. **Refactor continu** - Verbeter code terwijl tests groen blijven ## Extra verbeteringen: - Gebruik **dependency injection** voor complexere scenario's - Implementeer **strategie pattern** voor verschillende kortingsregels - Voeg **logging** toe voor betere debugbaarheid - Gebruik **constantes** voor kortingspercentages Door deze aanpassingen wordt je code beter testbaar, onderhoudbaarder en flexibeler voor toekomstige wijzigingen.