Skip to content

Commit f911e41

Browse files
authored
test(tree): Tree组件单元测试基本设计 (DevCloudFE#356)
* test(tree): 设计Tree组件的单元测试 * test(tree): tree组件单元测试基本设计
1 parent ab73dba commit f911e41

File tree

10 files changed

+163
-221
lines changed

10 files changed

+163
-221
lines changed

packages/devui-vue/devui-cli/commands/code-check.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ const eslintCheck = async (components) => {
5050

5151
const unitTestSingle = async (name) => {
5252
log(chalkUnitTest(`Start unit test ${name}...`));
53-
await shell.exec(`pnpm test --filter vue-devui -- --colors --noStackTrace --testMatch **/${name}.spec.ts`);
53+
await shell.exec(`pnpm test --filter vue-devui -- --colors --noStackTrace --testMatch **/${name}/**/{*.spec.ts,*.spec.tsx}`);
5454
log(chalkUnitTest(`Unit test ${name} finished!`));
5555
};
5656

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { ref } from 'vue';
2+
3+
export const basicData = ref([
4+
{
5+
label: 'Parent node 1',
6+
open: true,
7+
disabled: true,
8+
children: [
9+
{
10+
label: 'Parent node 1-1',
11+
disableToggle: true,
12+
children: [
13+
{
14+
label: 'Leaf node 1-1-1',
15+
}
16+
]
17+
},
18+
{
19+
label: 'Leaf node 1-2',
20+
},
21+
{
22+
label: 'Leaf node 1-3',
23+
},
24+
]
25+
},
26+
{
27+
label: 'Leaf node 2',
28+
}
29+
]);
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import { ComponentPublicInstance, nextTick } from 'vue';
2+
import { DOMWrapper, mount, VueWrapper } from '@vue/test-utils';
3+
import { Tree } from '../../';
4+
import { basicData } from './basic-data';
5+
6+
describe('Basic tree should include rendering of nested nodes and responses to hover, click and expand/collapse events.', () => {
7+
let wrapper: VueWrapper<ComponentPublicInstance>;
8+
let firstNode: Omit<DOMWrapper<Element>, 'exists'>;
9+
let lastNode: Omit<DOMWrapper<Element>, 'exists'>;
10+
11+
beforeAll(() => {
12+
wrapper = mount({
13+
setup() {
14+
return () => {
15+
return <Tree data={basicData.value} />;
16+
};
17+
},
18+
});
19+
20+
firstNode = wrapper.get('.devui-tree-node:first-child');
21+
lastNode = wrapper.get('.devui-tree-node:last-child');
22+
});
23+
24+
afterAll(() => {
25+
wrapper.unmount();
26+
});
27+
28+
it('Should render tree container correctly.', () => {
29+
expect(wrapper.classes()).toContain('devui-tree');
30+
});
31+
32+
it('Should render correct number of child nodes.', () => {
33+
expect(wrapper.element.childElementCount).toBe(5);
34+
});
35+
36+
it('Should render correct node content.', () => {
37+
expect(firstNode.text()).toBe('Parent node 1');
38+
expect(lastNode.text()).toBe('Leaf node 2');
39+
});
40+
41+
it('Should render the style of child node correctly.', () => {
42+
const childNodeParent = wrapper.get('.devui-tree-node:nth-child(2)');
43+
const childNodeLeaf = wrapper.get('.devui-tree-node:nth-child(3)');
44+
45+
expect(childNodeParent.attributes('style').indexOf('padding-left: 24px;') > -1).toBe(true);
46+
expect(childNodeLeaf.attributes('style').indexOf('padding-left: 24px;') > -1).toBe(true);
47+
});
48+
49+
it.todo('Should render the style of node connection line correctly.');
50+
51+
it.todo('The node should be highlighted when clicked.');
52+
53+
it.todo('The node should be disabled and unclickable when disabled is set to true.');
54+
55+
it('The node should expand and collapse correctly when the expand-collapse button is clicked.', async () => {
56+
// 初始状态,节点是展开的
57+
expect(firstNode.classes()).toContain('devui-tree-node__open');
58+
59+
// 点击之后,节点收起
60+
await wrapper.get('.devui-tree-node__folder:first-child').trigger('click');
61+
await nextTick();
62+
expect(firstNode.classes()).not.toContain('devui-tree-node__open');
63+
64+
// 再次点击,节点展开
65+
await wrapper.get('.devui-tree-node__folder:first-child').trigger('click');
66+
await nextTick();
67+
expect(firstNode.classes()).toContain('devui-tree-node__open');
68+
});
69+
70+
it.todo('The node should be disabled and unclickable when disableToggle is set to true.');
71+
});
Lines changed: 22 additions & 186 deletions
Original file line numberDiff line numberDiff line change
@@ -1,188 +1,24 @@
1-
import { mount, VueWrapper } from '@vue/test-utils';
2-
import type { ComponentPublicInstance } from 'vue';
3-
import { ref, nextTick } from 'vue';
4-
import DTree from '../src/tree';
5-
61
describe('tree', () => {
7-
let wrapper: VueWrapper<ComponentPublicInstance>;
8-
9-
beforeEach(() => {
10-
const data = ref([
11-
{
12-
label: 'parent node 1 - expanded',
13-
open: true,
14-
disabled: true,
15-
level: 1,
16-
children: [
17-
{
18-
label: 'parent node 11 - folded',
19-
level: 2,
20-
children: [
21-
{
22-
label: 'leaf node 111',
23-
level: 3,
24-
},
25-
{
26-
label: 'leaf node 112',
27-
level: 3,
28-
},
29-
{
30-
label: 'leaf node 113',
31-
level: 3,
32-
},
33-
{
34-
label: 'leaf node 114',
35-
level: 3,
36-
}
37-
]
38-
},
39-
{
40-
label: 'parent node 12 - folded',
41-
disableToggle: true,
42-
level: 2,
43-
children: [
44-
{
45-
label: 'leaf node 121',
46-
level: 3,
47-
},
48-
{
49-
label: 'leaf node 122',
50-
level: 3,
51-
},
52-
{
53-
label: 'leaf node 123',
54-
level: 3,
55-
},
56-
{
57-
label: 'leaf node 124',
58-
level: 3,
59-
}
60-
]
61-
},
62-
{
63-
label: 'parent node 13 - without children - dynamic loading',
64-
isParent: true,
65-
level: 2,
66-
}
67-
]
68-
},
69-
{
70-
label: 'parent node 2 - folded',
71-
level: 1,
72-
children: [
73-
{
74-
label: 'parent node 21 - expanded',
75-
open: true,
76-
level: 2,
77-
children: [
78-
{
79-
label: 'leaf node 211',
80-
level: 3,
81-
},
82-
{
83-
label: 'leaf node 212',
84-
level: 3,
85-
},
86-
{
87-
label: 'leaf node 213',
88-
level: 3,
89-
},
90-
{
91-
label: 'leaf node 214',
92-
level: 3,
93-
}
94-
]
95-
},
96-
{
97-
label: 'parent node 22 - folded',
98-
level: 2,
99-
children: [
100-
{
101-
label: 'leaf node 221',
102-
level: 3,
103-
},
104-
{
105-
label: 'leaf node 222',
106-
level: 3,
107-
},
108-
{
109-
label: 'leaf node 223',
110-
level: 3,
111-
},
112-
{
113-
label: 'leaf node 224',
114-
level: 3,
115-
}
116-
]
117-
},
118-
{
119-
label: 'parent node 23 - folded',
120-
level: 2,
121-
children: [
122-
{
123-
label: 'leaf node 231',
124-
level: 3,
125-
},
126-
{
127-
label: 'leaf node 232',
128-
level: 3,
129-
},
130-
{
131-
label: 'leaf node 233',
132-
level: 3,
133-
},
134-
{
135-
label: 'leaf node 234',
136-
level: 3,
137-
}
138-
]
139-
}
140-
]
141-
},
142-
{
143-
id: 'dynamicNode',
144-
label: 'parent node 3 - without children - dynamic loading',
145-
isParent: true,
146-
level: 1,
147-
data: {
148-
id: 'newChildNode',
149-
name: 'new child node'
150-
}
151-
}
152-
]);
153-
154-
wrapper = mount({
155-
components: { DTree },
156-
template: `
157-
<d-tree :data="data"></d-tree>
158-
`,
159-
setup () {
160-
return {
161-
data,
162-
};
163-
}
164-
});
165-
});
166-
167-
it('should render correctly', () => {
168-
expect(wrapper.classes()).toContain('devui-tree');
169-
expect(wrapper.element.childElementCount).toBe(6);
170-
});
171-
172-
it('should expand and collapse correctly', async () => {
173-
const firstNode = wrapper.get('.devui-tree-node:first-child');
174-
175-
// 初始状态,节点是展开的
176-
expect(firstNode.classes()).toContain('devui-tree-node__open');
177-
178-
// 点击之后,节点收起
179-
await wrapper.get('.devui-tree-node__folder:first-child').trigger('click');
180-
await nextTick();
181-
expect(firstNode.classes()).not.toContain('devui-tree-node__open');
182-
183-
// 再次点击,节点展开
184-
await wrapper.get('.devui-tree-node__folder:first-child').trigger('click');
185-
await nextTick();
186-
expect(firstNode.classes()).toContain('devui-tree-node__open');
187-
});
2+
// 测试节点懒加载功能是否正常
3+
it.todo('should loading child nodes dynamicly when click open button');
4+
5+
// 当节点下只有一个子节点时,应该合并这些节点
6+
it.todo('should merge nodes when there is only one child node');
7+
8+
/**
9+
* 测试嵌套节点渲染和基本交互
10+
* 测试节点懒加载功能是否正常
11+
* 当节点下只有一个子节点时,应该合并这些节点
12+
* 节点的勾选功能正常
13+
* 勾选复选框的禁用状态正常
14+
* 父子check控制功能正常
15+
* 自定义图标功能正常
16+
* 节点的增删改(操作按钮)功能正常
17+
* loading模板功能正常
18+
* 搜索过滤功能正常
19+
* 自定义树中显示和搜索的关键字功能正常
20+
* 拖拽排序功能正常
21+
* 虚拟滚动功能正常
22+
* 无动画功能正常
23+
*/
18824
});

packages/devui-vue/devui/tree/src/assets/close.svg

Lines changed: 0 additions & 17 deletions
This file was deleted.

packages/devui-vue/devui/tree/src/assets/open.svg

Lines changed: 0 additions & 14 deletions
This file was deleted.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { VNodeTypes } from 'vue';
2+
3+
export const IconClose = (): VNodeTypes => (
4+
<svg
5+
width="16px"
6+
height="16px"
7+
viewBox="0 0 16 16"
8+
version="1.1"
9+
xmlns="http://www.w3.org/2000/svg"
10+
class="svg-icon"
11+
>
12+
<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
13+
<rect x="0.5" y="0.5" width="15" height="15" rx="2" stroke="#252b3a"></rect>
14+
<path
15+
fill="#252b3a"
16+
d="M8.75,4 L8.75,7.25 L12,7.25 L12,8.75 L8.749,8.75 L8.75,12 L7.25,12 L7.249,8.75 L4,8.75 L4,7.25 L7.25,7.25 L7.25,4 L8.75,4 Z"
17+
></path>
18+
</g>
19+
</svg>
20+
);
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { VNodeTypes } from 'vue';
2+
3+
export const IconOpen = (): VNodeTypes => (
4+
<svg
5+
width="16px"
6+
height="16px"
7+
viewBox="0 0 16 16"
8+
version="1.1"
9+
xmlns="http://www.w3.org/2000/svg"
10+
class="svg-icon svg-icon-close"
11+
>
12+
<g stroke-width="1" fill="none" fill-rule="evenodd">
13+
<rect x="0.5" y="0.5" width="15" height="15" rx="2" stroke="#5e7ce0"></rect>
14+
<rect x="4" y="7" width="8" height="2" fill="#5e7ce0"></rect>
15+
</g>
16+
</svg>
17+
);

0 commit comments

Comments
 (0)