You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Vue3 Quasar徽章组件的Jest循环测试代码?

问题描述

我在Vue Quasar组件中使用<q-badge>徽章:

<q-badge
    :color="green"
    text-color="white"
    :label="`${value.toFixed(2)}%`"
/>

对应的脚本代码:

<script setup>
    const props = defineProps({
        value: Number
    })
</script>

我想用Jest测试3个不同值下徽章的label文本,测试代码如下:

let wrapper
const values_for_badge = [10, 50, 90]
const componentBadge = (props) =>{
    wrapper = mount(Badge, {
        props:{
            ...props
        }
    });
};

describe('Badge with injected values', () =>{
    values_for_badge.forEach(value => {
        beforeEach(() => {
            componentBadge({value:value})
        });
        
        it(`The right text label for value ${value}`, () => {
            expect(wrapper.text()).toBe(`${value.toFixed(2)}%`)
        })
    })
})

运行测试后,只有最后一个测试通过,其余两个失败。预期显示对应值的两位小数百分比(如10.00%、50.00%),但实际始终显示90.00%,不过测试描述里的循环值是正确的。组件实际运行正常,label显示正确,请问该如何修改测试代码?


问题原因及修复

问题出在全局变量wrapper结合闭包特性:循环中的beforeEach和it函数会捕获同一个外部wrapper变量,而Jest的测试钩子是异步执行的,当所有beforeEach触发时,循环已经遍历到最后一个值90,导致所有测试都指向最后一次挂载的组件实例。

以下是两种可行的修复方案:

方案1:将wrapper作用域缩小到单个测试块

直接在每个it内部创建组件实例,避免变量共享:

const values_for_badge = [10, 50, 90]
const componentBadge = (props) => mount(Badge, { props: { ...props } });

describe('Badge with injected values', () =>{
    values_for_badge.forEach(value => {
        it(`The right text label for value ${value}`, () => {
            const wrapper = componentBadge({value})
            expect(wrapper.text()).toBe(`${value.toFixed(2)}%`)
        })
    })
})

方案2:将wrapper声明在describe内部

保留beforeEach结构的同时,把wrapper放到describe作用域内,确保每次测试前都会重新赋值新的实例:

const values_for_badge = [10, 50, 90]
const componentBadge = (props) => mount(Badge, { props: { ...props } });

describe('Badge with injected values', () =>{
    let wrapper // 作用域限定在describe内部
    values_for_badge.forEach(value => {
        beforeEach(() => {
            wrapper = componentBadge({value})
        });
        
        it(`The right text label for value ${value}`, () => {
            expect(wrapper.text()).toBe(`${value.toFixed(2)}%`)
        })
    })
})

核心逻辑是让每个测试块拥有独立的组件实例引用,避免闭包导致的变量覆盖问题。

内容的提问来源于stack exchange,提问作者Deotyma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 17:07:21