/** * 模块绑定弹层(ModulePickerModal):模块树默认全部收起。 * * 回归点:弹层曾用 default-expanded-keys 展开第一层根节点,一打开就铺开整棵树; * 现在不设该 prop,初始只渲染根节点,子节点由用户按需逐层点开。 * 折叠态下子树不渲染(tree-node.vue 用 v-if 而非 v-show),因此可直接数 treeitem。 */ import { beforeEach, describe, expect, it } from 'vitest' import { flushPromises, mount } from '@vue/test-utils' import { nextTick } from 'vue' import ModulePickerModal from '@/views/module/menu-management/ModulePickerModal.vue' const TREE = [ { b_id: 'base', b_module_type: 'module', b_name: '基础资料', children: [ { b_id: 'base_otherdata', b_module_type: 'module', b_name: '其他数据', children: [{ b_id: 'b_port', b_module_type: 'data', b_name: '港口' }], }, ], }, { b_id: 'system', b_module_type: 'module', b_name: '系统', children: [{ b_id: 'b_user', b_module_type: 'data', b_name: '用户' }], }, ] const MODULE_TYPES = { base: 'module', base_otherdata: 'module', b_port: 'data', system: 'module', b_user: 'data', } async function mountModal(props = {}) { const wrapper = mount(ModulePickerModal, { props: { open: true, treeData: TREE, checkedKeys: [], moduleTypes: MODULE_TYPES, ...props, }, // Modal 用 Teleport 挂到 body;打桩后内容留在组件树内,便于断言 global: { stubs: { teleport: true } }, }) await flushPromises() await nextTick() return wrapper } beforeEach(() => { localStorage.clear() sessionStorage.clear() }) describe('模块绑定弹层:树默认收起', () => { it('初始只渲染根节点,没有任何节点处于展开态', async () => { const wrapper = await mountModal() const items = wrapper.findAll('[role="treeitem"]') expect(items).toHaveLength(TREE.length) expect(items.map((item) => item.attributes('aria-expanded'))).toEqual([ 'false', 'false', ]) }) it('折叠态下子节点不渲染', async () => { const wrapper = await mountModal() expect(wrapper.text()).toContain('基础资料') expect(wrapper.text()).not.toContain('其他数据') expect(wrapper.text()).not.toContain('港口') }) })