0

I'm trying to figure out how to test a basic FormKit form using Vue and Vite. The form has a text field and a button. If you enter text and then click the button, it should display in another field on the screen the text you entered.

In the test, I can enter in text and can see that the button is clicked, but the text field is empty and therefore I don't see what was entered on the screen. What am I missing? I'm going in circles trying things and haven't found many examples in my searches. thanks!

Here is my basic form:

<template>
<div class="ml-6 mt-6">
  <h2>Basic Form</h2>
  <FormKit type="form" id="myform" v-model="myform" :actions="false">
    <FormKit
      type="text"
      name="name"
      id="name"
      label="Name:"
      help="Your full name"
      placeholder="“Jon Doe”"
    />
    <div class="mt-6 mb-6">
      <FormKit
        type="button"
        name="clickme"
        data-testid="clickme"
        label="Click Me"
        help="This will show what you entered."
        @click="displayName"
      />
    </div>
  </FormKit>
  <div class="mt-4">
    <p>Entered Name: {{ enteredName }}</p>
  </div>
</div>
</template>

<script setup>
import { ref } from 'vue';

const myform = ref();
let enteredName = ref('');

function displayName()
{
  console.log('button clicked');
  enteredName.value = myform.value.name;
  console.log('form value: ' + JSON.stringify(myform.value));
  console.log('Entered Name: ' + enteredName.value);
}
</script>

here is my test:

import { mount} from '@vue/test-utils';
import { beforeEach, describe, it, expect } from 'vitest';
import BasicForm from '../components/BasicForm.vue';
import { plugin, defaultConfig } from "@formkit/vue";

describe('BasicForm.vue', () => {
  let wrapper = null;
  beforeEach(() => {
        // render the component
        wrapper = mount(BasicForm, {
      attachTo: document.getElementById('app'),
            props: {
            },
            global: {
                plugins: [
                    [plugin, defaultConfig],
                ],
            },
        });
  });

  it('displays the entered name when the button is clicked', async () => {
    // Find the input and set its value
    const input = wrapper.find('input[name="name"]');
    console.log('input= ' + JSON.stringify(input));
    await input.setValue('Joe Doe');
    console.log('input= ' + JSON.stringify(input));

    // Find the button and trigger a click event
    const button = await wrapper.find('[data-testid="clickme"]');
    console.log('button= ' + JSON.stringify(button));
    await button.trigger('click');
    await wrapper.vm.$nextTick();

    // Assert that the entered name is displayed
    // expect(wrapper.vm.enteredName).toBe('Joe Doe');
    expect(wrapper.text()).toContain('Entered Name: Joe Doe');
  });
});

Here is the test result: test result

New contributor
techLiberty is a new contributor to this site. Take care in asking for clarification, commenting, and answering. Check out our Code of Conduct.
1
  • If you want to check if the input was set properly, check for the value of the input rather than the entire wrapper.
    – kissu
    Commented Dec 9 at 19:28

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.