javascript - 如何在 Vue 测试文件中使用嵌套数据属性和挂载方法
问题描述
我正在尝试使用 Vue test utils 和 jest 来测试用户输入和提交。我遇到了几个错误,如果有人能给我指出一个非常好的使用 Vue 的 TDD 指南,我会很高兴。
零件
<template>
<div class="container">
<div class="col-md-6">
<label for="firstname" class="form-group-placeholder"></label>
<input id="firstname" type="text" v-model="details.firstname" />
</div>
<div class="col-md-6">
<label for="lastname" class="form-group-placeholder"></label>
<input id="lastname" type="text" v-model="details.lastname" />
</div>
<div class="col-md-6">
<label for="email" class="form-group-placeholder"></label>
<input id="email" type="email" v-model="details.email" />
</div>
<div class="col-md-6">
<label for="password" class="form-group-placeholder"></label>
<input id="password" type="password" v-model="details.password" />
</div>
<div class="col-md-12">
<button class="btn" @click="registerUser">
Create an account
</button>
</div>
</div>
</template>
<script>
export default {
name: "Register",
data() {
return {
details: {
firstname: null,
lastname: null,
email: null,
password: null
}
};
},
methods: {
async registerUser() {
try {
let response = await this.$axios.post(
"/register",
this.details
);
} catch (error) {
}
}
}
};
</script>
测试
import { shallowMount } from "@vue/test-utils";
import Register from "../register";
describe("RegisterSponsor", () => {
it("Will trigger an action with default object when form is submited", async () => {
const expectedData = {
firstname: null,
lastname: null,
email: null,
password: null
};
const RegisterUser = jest.fn();
const wrapper = shallowMount(Register, {
data() {
return {
details: {
expectedData
}
};
},
methods: {
registerUser()
}
});
wrapper.find("button").trigger("click");
await wrapper.vm.$nextTick();
expect(RegisterUser).toHaveBeenCalled();
});
});
我在这里遇到了几个错误,例如“TypeError: Cannot read property 'firstname' of undefined”和[Vue warn]: Error in data(): "TypeError: Cannot read property 'params' of undefined"
提交触发器也不起作用。老实说,文档可能会更好。
解决方案
首先,当您安装组件时,无需传递data
和methods
参数,data()
您的组件将自动设置,您将使用现有methods
的组件。其次,如果你想断言它registerUser
被调用,你应该像这样监视那个方法:
jest.spyOn(wrapper.vm, 'registerUser')
第三,如果您在单击按钮后没有检查组件的 DOM 结构,则可以摆脱$nextTick
调用。
综上所述,测试应如下所示:
describe("RegisterSponsor", () => {
it('Will trigger an action with default object when form is submited', async () => {
const wrapper = shallowMount(Register);
jest.spyOn(wrapper.vm, 'registerUser')
await wrapper.find('button').trigger('click');
expect(wrapper.vm.registerUser).toHaveBeenCalled();
});
});
推荐阅读
- python - 如何找到一个方程的根,其中变量是函数的输出,目标变量作为参数本身?
- node.js - SSE 返回的数据比文件大小大 x50
- c++ - 如何转发声明依赖于变体定义的类,而后者又依赖于模板类?
- sql - SQL Server 查询 JSONobject 以获取聚合值
- javascript - 在 react-native / expo 中访问异步函数内的 const
- node.js - Firebase max 写入云函数
- swift - 为什么手动设置根视图控制器显示黑屏?
- hyperledger-fabric - 如何修复“存储私钥失败”?Error01 问题?
- python - 为什么打印函数中的 \r 不重写标准输出而是在下一行打印?
- java - 如何使用android中的函数做一个异步计数器