slogan3

Ontwikkel een Vue.js Component met Geautomatiseerde Unit Tests

description

Met deze prompt kan de gebruiker leren hoe hij zijn Vue.js componenten grondig kan testen met unit tests, wat helpt bugs vroeg te detecteren, de codekwaliteit te verhogen en onderhoud te vereenvoudigen. Dit is effectiever dan handmatig testen en voorkomt regressies bij toekomstige wijzigingen.

prompt

Help me een Vue.js component te ontwikkelen dat voorzien is van geautomatiseerde unit tests. Leg uit hoe ik Jest of Vue Test Utils kan gebruiken om componentfunctionaliteit en reactieve data te ...

try_prompt

generate_helper
disclaimerOnPageApi

ai_answers

provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een stapsgewijze uitleg om een Vue.js component te ontwikkelen met geautomatiseerde unit tests, inclusief gebruik van Jest en Vue Test Utils. ### Stap 1: Component maken Laten we een eenvoudige Vue-component maken die taken toevoegt en verwijdert. ```vue <!-- TodoList.vue --> <template> <div> <input v-model="newTask" placeholder="Nieuwe taak" /> <button @click="addTask">Toevoegen</button> <ul> <li v-for="(task, index) in tasks" :key="index"> {{ task }} <button @click="removeTask(index)">Verwijderen</button> </li> </ul> </div> </template> <script> export default { data() { return { newTask: '', tasks: [] }; }, methods: { addTask() { if (this.newTask.trim() !== '') { this.tasks.push(this.newTask.trim()); this.newTask = ''; } }, removeTask(index) { this.tasks.splice(index, 1); } } }; </script> ``` ### Stap 2: Unit tests schrijven met Jest en Vue Test Utils Installeer eerst de benodigde dependencies: ```bash npm install --save-dev jest @vue/test-utils vue-jest ``` Voeg een testbestand toe, bijvoorbeeld `TodoList.spec.js`: ```js import { shallowMount } from '@vue/test-utils'; import TodoList from '@/components/TodoList.vue'; describe('TodoList.vue', () => { let wrapper; beforeEach(() => { wrapper = shallowMount(TodoList); }); // Test of de component rendert test('rendert de component correct', () => { expect(wrapper.exists()).toBe(true); expect(wrapper.find('input').exists()).toBe(true); expect(wrapper.find('button').exists()).toBe(true); }); // Test of een taak toevoegen test('voegt een taak toe bij knopklik', async () => { const input = wrapper.find('input'); await input.setValue('Nieuwe taak'); const button = wrapper.find('button'); await button.trigger('click'); expect(wrapper.vm.tasks).toContain('Nieuwe taak'); expect(wrapper.vm.newTask).toBe(''); }); // Test of een taak verwijderen test('verwijdert een taak bij knopklik', async () => { // Voeg eerst een taak toe wrapper.setData({ tasks: ['Taak 1', 'Taak 2'] }); await wrapper.vm.$nextTick(); const removeButtons = wrapper.findAll('li button'); await removeButtons.at(0).trigger('click'); expect(wrapper.vm.tasks).not.toContain('Taak 1'); expect(wrapper.vm.tasks).toContain('Taak 2'); }); }); ``` ### Stap 3: Testen uitvoeren Voeg in je `package.json` een script toe: ```json "scripts": { "test": "jest" } ``` En voer de tests uit met: ```bash npm run test ``` ### Samenvatting: - Je hebt een Vue-component gemaakt die taken toevoegt en verwijdert. - Met Vue Test Utils en Jest heb je tests geschreven voor: - Rendering van de component - Klikken op de knop om een taak toe te voegen - Verwijderen van een taak via de knop - Je kunt deze aanpak uitbreiden met meer tests, zoals invoer validatie of reactieve data-binding. Wil je nog meer voorbeelden of hulp bij een specifiek onderdeel?
provider: deepseek
model: deepseek-chat
Hier is een complete uitleg voor het ontwikkelen en testen van een Vue.js takenlijst component: ## Vue.js Takenlijst Component ```vue <template> <div class="task-list"> <h2>Mijn Taken</h2> <div class="add-task"> <input v-model="newTask" @keyup.enter="addTask" placeholder="Voer een nieuwe taak in" class="task-input" /> <button @click="addTask" class="add-btn">Taak Toevoegen</button> </div> <ul class="tasks"> <li v-for="(task, index) in tasks" :key="index" class="task-item"> <span>{{ task }}</span> <button @click="removeTask(index)" class="remove-btn">Verwijderen</button> </li> </ul> <p v-if="tasks.length === 0" class="no-tasks">Geen taken toegevoegd</p> </div> </template> <script> export default { name: 'TaskList', data() { return { newTask: '', tasks: [] } }, methods: { addTask() { if (this.newTask.trim() !== '') { this.tasks.push(this.newTask.trim()) this.newTask = '' } }, removeTask(index) { this.tasks.splice(index, 1) } } } </script> <style scoped> .task-list { max-width: 500px; margin: 0 auto; padding: 20px; } .task-input { padding: 8px; margin-right: 10px; width: 200px; } .add-btn, .remove-btn { padding: 8px 12px; cursor: pointer; } .tasks { list-style: none; padding: 0; } .task-item { display: flex; justify-content: space-between; align-items: center; padding: 10px; border-bottom: 1px solid #ddd; } .no-tasks { color: #666; font-style: italic; } </style> ``` ## Test Setup met Jest en Vue Test Utils ### 1. Installatie ```bash npm install --save-dev @vue/test-utils jest vue-jest ``` ### 2. Jest Configuratie (jest.config.js) ```javascript module.exports = { preset: '@vue/cli-plugin-unit-jest', testMatch: [ '**/tests/unit/**/*.spec.[jt]s?(x)' ], collectCoverageFrom: [ 'src/**/*.{js,vue}', '!src/main.js' ] } ``` ## Unit Tests voor TaskList Component ```javascript // tests/unit/TaskList.spec.js import { mount } from '@vue/test-utils' import TaskList from '@/components/TaskList.vue' describe('TaskList.vue', () => { // Test 1: Component rendert correct it('rendert het component correct', () => { const wrapper = mount(TaskList) // Controleer of de titel aanwezig is expect(wrapper.find('h2').text()).toBe('Mijn Taken') // Controleer of inputveld aanwezig is expect(wrapper.find('.task-input').exists()).toBe(true) // Controleer of knop aanwezig is expect(wrapper.find('.add-btn').exists()).toBe(true) expect(wrapper.find('.add-btn').text()).toBe('Taak Toevoegen') }) // Test 2: Knop klik triggert addTask methode it('triggert addTask bij knop klik', async () => { const wrapper = mount(TaskList) // Stel input waarde in await wrapper.find('.task-input').setValue('Nieuwe taak') // Klik op de knop await wrapper.find('.add-btn').trigger('click') // Controleer of taak is toegevoegd expect(wrapper.vm.tasks).toContain('Nieuwe taak') expect(wrapper.vm.newTask).toBe('') // Input moet leeg zijn na toevoegen }) // Test 3: Taak toevoegen met Enter key it('voegt taak toe met Enter key', async () => { const wrapper = mount(TaskList) await wrapper.find('.task-input').setValue('Taak met Enter') await wrapper.find('.task-input').trigger('keyup.enter') expect(wrapper.vm.tasks).toContain('Taak met Enter') }) // Test 4: Lege taak toevoegen wordt voorkomen it('voegt geen lege taken toe', async () => { const wrapper = mount(TaskList) const initialTaskCount = wrapper.vm.tasks.length await wrapper.find('.task-input').setValue(' ') // Alleen spaties await wrapper.find('.add-btn').trigger('click') expect(wrapper.vm.tasks.length).toBe(initialTaskCount) }) // Test 5: Taak verwijderen functionaliteit it('verwijdert taken correct', async () => { const wrapper = mount(TaskList) // Voeg eerst taken toe await wrapper.find('.task-input').setValue('Taak 1') await wrapper.find('.add-btn').trigger('click') await wrapper.find('.task-input').setValue('Taak 2') await wrapper.find('.add-btn').trigger('click') // Verwijder eerste taak await wrapper.find('.remove-btn').trigger('click') expect(wrapper.vm.tasks).not.toContain('Taak 1') expect(wrapper.vm.tasks).toContain('Taak 2') }) // Test 6: Reactieve data updates it('update reactieve data correct', async () => { const wrapper = mount(TaskList) // Test newTask data binding await wrapper.find('.task-input').setValue('Test taak') expect(wrapper.vm.newTask).toBe('Test taak') // Test tasks array updates await wrapper.find('.add-btn').trigger('click') expect(wrapper.vm.tasks).toHaveLength(1) expect(wrapper.vm.tasks[0]).toBe('Test taak') }) // Test 7: Template updates met data wijzigingen it('update template wanneer data wijzigt', async () => { const wrapper = mount(TaskList) // Voeg taak toe await wrapper.find('.task-input').setValue('Zichtbare taak') await wrapper.find('.add-btn').trigger('click') // Controleer of taak zichtbaar is in template expect(wrapper.find('.tasks').text()).toContain('Zichtbare taak') expect(wrapper.find('.no-tasks').exists()).toBe(false) // Verwijder alle taken await wrapper.find('.remove-btn').trigger('click') expect(wrapper.find('.no-tasks').exists()).toBe(true) }) }) ``` ## Test Commands Voeg deze scripts toe aan je `package.json`: ```json { "scripts": { "test:unit": "vue-cli-service test:unit", "test:watch": "vue-cli-service test:unit --watch", "test:coverage": "vue-cli-service test:unit --coverage" } } ``` ## Belangrijke Test Concepten 1. **mount()**: Creëert een volledig gerenderde component instantie 2. **find()**: Zoekt elementen in de component template 3. **trigger()**: Simuleert gebruikersinteracties zoals klikken 4. **setValue()**: Stelt waarden in voor form inputs 5. **async/await**: Voor het afhandelen van Vue's reactieve updates Deze tests dekken alle gevraagde scenario's en demonstreren hoe je component functionaliteit en reactieve data kunt testen met Vue Test Utils en Jest.
error: Generation failed [deepseek] prompt_id=4090 locale=es err=DeepSeek connection/timeout