Vue 组件中的 toHaveBeenCalled() 玩笑测试失败

Posted

技术标签:

【中文标题】Vue 组件中的 toHaveBeenCalled() 玩笑测试失败【英文标题】:Failed toHaveBeenCalled() jest test in Vue component 【发布时间】:2019-05-01 14:45:01 【问题描述】:

在测试中使用“点击”触发器无法正常调用函数。

    我调用了函数 - 它正在工作

    我触发了点击,但测试失败。

    describe("Message.test.js", () => 
        let wrapper;
        const createWrapper = propsData => mount(Message,  propsData 
    
        describe("Events", () => 
            beforeEach(() => 
             wrapper = createWrapper( message: "Cat" );
        ); 
    
        //Working
        it("calls handleClick", () => 
            const spy = jest.spyOn(wrapper.vm, 'handleClick');
            wrapper.vm.handleClick();
            expect(spy).toHaveBeenCalled();
        );
    
        //NOT WORKING. WHY?
    
        it("calls handleClick when click on message", () => 
            wrapper.vm.handleClick = jest.fn();
            //It is Ok
            expect(wrapper.contains('.message')).toBe(true);
            // @click="handleClick" on element
            wrapper.find('.message').trigger('click');
            expect(wrapper.vm.handleClick).toHaveBeenCalledTimes(1);
        )
    );
    

我在函数中添加了console.log。在测试过程中,我看到调用了什么函数。

【问题讨论】:

【参考方案1】:

 it('calls handleClick when click on message', () => 
            const handleClick = jest.fn()
            wrapper.setMethods( handleClick )
            const el = wrapper.find('.message').trigger('click')
            expect(handleClick).toBeCalled()
        )
// stub
        it('triggers a message-clicked event when a handleClick method is called', () => 
            const stub = jest.fn()
            wrapper.vm.$on('message-clicked', stub)
            wrapper.vm.handleClick()
            expect(stub).toBeCalledWith('Cat')
        )

【讨论】:

以上是关于Vue 组件中的 toHaveBeenCalled() 玩笑测试失败的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Vue-test-utils 和 Jest 测试 Vuex 突变

vue组件调用另外一个组件中的方法

预期的间谍“服务方法”已被调用。 - 角 10

如何在单个文件 vue 组件中的初始化时将道具传递给 vue 组件(vue-loader 中的依赖注入)?

说说vue.js中的组件

vue中的prop