使用 Vue 测试工具和 Jest 测试 Vuetify 表单验证

Posted

技术标签:

【中文标题】使用 Vue 测试工具和 Jest 测试 Vuetify 表单验证【英文标题】:Test Vuetify form validation with Vue test utils and Jest 【发布时间】:2020-11-25 07:28:52 【问题描述】:

我使用 Vue ^2.6、Vuetify ^2.3、Jest ^26.2 和 Vue 测试工具 ^1.0。

我的登录组件:

<template>
    <v-row>
        <v-sheet>
            <v-row>
                <v-form
                        v-model="loginFormIsValid"
                        :lazy-validation="false"
                >
                    <v-text-field
                            id="cr-login-credential"
                            v-model="credential"
                            :rules="[
                (value) => !!value || 'Required.',
                (v) => /.+@.+\..+/.test(v) || 'E-mail must be valid',
              ]"
                    ></v-text-field>
                    <v-text-field
                            id="cr-login-password"
                            v-model="password"
                            :rules="[(value) => !!value || 'Required.']"
                    ></v-text-field>
                    <v-checkbox
                            v-model="remember_me"
                            id="cr-login-remember_me"
                    ></v-checkbox>
                </v-form>
                <v-btn :disabled="!loginFormIsValid" class="cr-login-submit-btn"/>
            </v-row>
        </v-sheet>
    </v-row>
</template>

<script>
    export default 
        data() 
            return 
                credential: null,
                password: null,
                remember_me: null,
                loginFormIsValid: false,
            ;
        ,
    ;
</script>

我的测试:

import  createLocalVue, mount  from '@vue/test-utils';
import Vuetify from 'vuetify';
import Vue from 'vue';
import  Login  from '@/entry';
import '@testing-library/jest-dom';

Vue.use(Vuetify);
const localVue = createLocalVue();

const factory = (vuetify) => mount(Login, 
  localVue,
  vuetify,
);

describe('Login.vue', () => 
  let vuetify;

  beforeEach(() => 
    vuetify = new Vuetify();
  );
  it('check submit button is disabled if fields are empty', () => 
    const wrapper = factory(vuetify);
    const email = '';
    const password = '';

    wrapper.find('#cr-login-credential').setValue(email);
    wrapper.find('#cr-login-password').setValue(password);

    expect(wrapper.vm.credential).toBe(email);
    expect(wrapper.vm.password).toBe(password);

    expect(wrapper.vm.loginFormIsValid).toBeFalsy();
    expect(wrapper.find('.cr-login-submit-btn').element).toBeDisabled();
  );
);

(我省略了无用的代码)

当我运行测试时,它失败了:

Error: expect(received).toBeFalsy()

Received: true

数据loginFormIsValid 未更新,我的按钮始终为disabled

你能解释一下测试我的数据的好过程吗?

【问题讨论】:

【参考方案1】:

我刚刚遇到了这个确切的问题。在调用任何 vue-test-utils setValue() 方法后调用 Vue.nextTick() 后,我能够解决该问题。注意:您需要将这些测试转换为异步函数。

所以对于您的具体测试,我会尝试以下方法:

it('check submit button is disabled if fields are empty', async () => 
    const wrapper = factory(vuetify);
    const email = '';
    const password = '';

    wrapper.find('#cr-login-credential').setValue(email);
    wrapper.find('#cr-login-password').setValue(password);

    await Vue.nextTick();

    expect(wrapper.vm.credential).toBe(email);
    expect(wrapper.vm.password).toBe(password);

    expect(wrapper.vm.loginFormIsValid).toBeFalsy();
    expect(wrapper.find('.cr-login-submit-btn').element).toBeDisabled();
);

更多信息请参见https://***.com/a/60701786/6698029。

【讨论】:

以上是关于使用 Vue 测试工具和 Jest 测试 Vuetify 表单验证的主要内容,如果未能解决你的问题,请参考以下文章

Vue 和 Jest 单元测试组件

使用 Vue.js 和 Jest 进行 URL 重定向测试

使用 Jest 进行 Vue 单元测试

在 Nuxt、Vue、jest 和 Vuetify 中为项目编写单元测试

vue项目中增加Jest测试功能

Vue3 Vite 和 jest 测试没有模板编译器