如何使用 jest 测试 Vue.js 组件中方法的错误

Posted

技术标签:

【中文标题】如何使用 jest 测试 Vue.js 组件中方法的错误【英文标题】:How to test an Error of a Method in a Vue.js Component using jest 【发布时间】:2020-04-01 08:58:48 【问题描述】:

如何测试我的 Vue 组件的方法createUser()?我想测试 createUser() 方法是否会抛出 Error 如果 firstname < 2 例如。这怎么可能?

我不太熟悉测试 VUE 组件。这是我的第一次,所以我不知道如何访问 VUE 组件以及如何向组件提交例如用户名

<script>
import ApiService from '../ApiService.js';
import User from '../User.js';

//const API_URL = 'http://localhost:8080';
const apiService = new ApiService();

export default 
    name: "CreateUser",

    data() 
        return 
            input: 
                username: "",
                firstname: "",
                lastname: "",
                title: "",
                password: "",
                groupId: "",
                groups: [],
            ,
        
    ,

    /.../

    methods: 

        getAllGroups() 
            apiService.getAllGroups().then((data) => 
                this.input.groups = data;
            );
        ,

        createUser() 

            if (this.input.firstname == null || this.input.firstname.length < 2 || this.input.firstname > 50) 
                throw ("Firstname to short/long/empty");
             else 
                let user = new User(this.input.username, this.input.lastname, this.input.title, this.input.firstname, this.input.password, this.input.groupId)

                apiService.createUser(user).then(() => 
                    location.reload()
                );
            
        ,

我尝试了以下方法,但有些不起作用

import  shallowMount  from '@vue/test-utils';
import UserModal from "../src/views/UserModal";

describe('UsarModal', () => 
    it('should throw error when first name is too short', () => 

        const myItems = [
            
            username: "Heinz",
            firstname: "H",
            lasname: "Müller"
        ]

        const wrapper = shallowMount(UserModal, 
            input: 
                myItems
            
        )

        expect(wrapper.vm.createUser()).toThrow("Firstname to short/long/empty")
    )
)

【问题讨论】:

代码格式和语法修订。 【参考方案1】:

因为在代码中,它抛出了一个错误,所以我们需要在我们的测试用例中添加一个 catch 块来测试这个场景。您的案例的 PFB 示例:

try 
    wrapper.vm.createUser();
   catch (error) 
    expect(error).toBe('Firstname to short/long/empty');
  

如果您遇到任何问题,请告诉我。

【讨论】:

【参考方案2】:

感谢您的提示!但仍有一些事情无法正常工作。在我看来,它不接受我的模拟数据作为输入。我想测试当我使用太短的用户名时是否出错。但即使我输入了足够长的用户名,try catch 块也会捕获我的错误,如您在附图中所见。

import shallowMount from '@vue/test-utils'
import UserModal from "./UserModal";

describe('ParentComponent', () => 
test("displays 'Emitted!' when custom event is emitted", () => 
    const wrapper = shallowMount(UserModal, 
                input: 
                    username: "asfsf",
                    firstname: "thomas",
                    lastname: "bird",
                    title: "Dr.",
                    password: "asdasda",
                    groupId: "2",
                    groups: [],

    );

    try 
        wrapper.vm.createUser();
     catch (error) 
        expect(error).toBe("username missing");
    
)
);

Error Log

【讨论】:

以上是关于如何使用 jest 测试 Vue.js 组件中方法的错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 vue.js 提高 JEST 测试性能

Jest - 测试在反应变量中声明的 Vue.js 函数

如何对第一个Vue.js组件进行单元测试 (下)

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

无法在基于 jest 和 vue-test-utils 的测试项目中使用 vue.js 的 ES6 模块

如何测试我的数据是不是更改? (Vue JS、Jest、单元测试)