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

Vue3+Vitest测试Quasar QDrawer时$layout.totalWidth未定义报错解决

解决Vitest测试QDrawer时$layout.totalWidth未定义的报错

问题场景

在Vue 3项目中使用Vitest编写单元测试,测试包含Quasar QDrawer组件的自定义组件时,点击触发抽屉显示后,抛出$layout.totalWidth.value未定义的类型错误。

报错信息

TypeError: Cannot read properties of undefined (reading 'value')
 ❯ setup node_modules/quasar/src/components/drawer/QDrawer.js:88:62
     86|     const belowBreakpoint = ref(
     87|       props.behavior === 'mobile'
     88|       || (props.behavior !== 'desktop' && $layout.totalWidth.value <= props.breakpoint)
       |                                                              ^
     89|     )

相关组件代码片段

...
<div v-if="origemParagrafoPadrao === 'previo'">
    <div>
      <q-btn @click="drawerParagrafoPadrao = !drawerParagrafoPadrao" dense no-caps color="primary" label="Escolher parágrafo padrão" class="q-my-md" icon-right="arrow_right"/>
    </div>
    <div>
      <q-card flat bordered v-for="texto in selecaoTextoAutuacao" :key="texto.id">
        <q-card-section>
          <div class="flex">
            <h6 class="text-subtitle2 text-weight-bold">{{ texto.id }} - {{ texto.titulo }}</h6>
            <a class="q-link text-primary cursor-pointer q-ml-xs" :id="'lnkExcluirTextoJurisprudencia' + texto.id"
                @click="excluirTextoParagrafoPadrao(texto)">
              ( Excluir )
            </a>
          </div>
          <div v-html="texto.texto" style="white-space: pre-wrap;"></div>
        </q-card-section>
      </q-card>
    </div>
    <q-drawer v-model="drawerParagrafoPadrao" side="right" :breakpoint="10" bordered  class="shadow-2 rounded-borders" :width="900">
      <div class="flex justify-between items-center q-ma-md">
...

解决方法

方法1:模拟$layout全局对象

在测试的render配置中,通过global.mocks注入模拟的$layout对象,给totalWidth.value设置一个合理数值(比如大于组件中设置的breakpoint值10):

render(Paragraph, {
    props: { analise: analise, textosAutuacao: autuacao },
    global: {
        plugins: [Quasar],
        mocks: {
          $layout: {
            totalWidth: { value: 1200 } // 模拟窗口宽度大于断点值
          }
        }
    }
})

方法2:强制QDrawer使用desktop行为

修改QDrawer的behavior属性为desktop,组件会跳过基于窗口宽度的断点判断,也就不会访问$layout.totalWidth:

<q-drawer 
  v-model="drawerParagrafoPadrao" 
  side="right" 
  :breakpoint="10" 
  bordered  
  class="shadow-2 rounded-borders" 
  :width="900"
  behavior="desktop" <!-- 添加该属性 -->
>

方法3:使用Quasar测试工具初始化布局环境

如果项目引入了@quasar/quasar-app-extension-testing-unit-vitest,可以通过setupQuasarTesting工具初始化完整的Quasar测试环境,自动提供$layout等全局对象:

import { setupQuasarTesting } from '@quasar/quasar-app-extension-testing-unit-vitest'

setupQuasarTesting()

// 执行测试渲染
render(Paragraph, {
    props: { analise: analise, textosAutuacao: autuacao },
    global: {
        plugins: [Quasar]
    }
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:00:16