Skip to content

Commit 1604df5

Browse files
committed
更新 .gitignore 文件,调整覆盖率目录;重构 MemoizeDict 测试用例,优化数据处理逻辑
1 parent 5e5147a commit 1604df5

File tree

3 files changed

+66
-67
lines changed

3 files changed

+66
-67
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
node_modules
33
dist
44

5-
/coverage
5+
/src/coverage
66
/src/client/shared.ts
77
/src/node/shared.ts
88
*.log

src/index.test.ts

Lines changed: 54 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2-
import { nextTick } from 'vue';
3-
import { MemoizeDict } from './index';
2+
import { MemoizeDict } from '.';
43

5-
// TODO: 需要重写。
64
describe('MemoizeDict', () => {
5+
76
type DictData = {
87
id: number;
98
label: string;
109
parent: number;
1110
};
11+
1212
const mockData = [
1313
{ id: 1, label: 'Item 1', parent: 0 },
1414
{ id: 2, label: 'Item 2', parent: 1 },
@@ -17,6 +17,17 @@ describe('MemoizeDict', () => {
1717

1818
const dataFunc = vi.fn();
1919

20+
beforeEach(() => {
21+
dataFunc.mockReset();
22+
dataFunc.mockImplementation((dictName: string) => {
23+
return new Promise<DictData[]>((resolve) => {
24+
setTimeout(() => {
25+
resolve(mockData);
26+
}, 100);
27+
});
28+
})
29+
});
30+
2031
const memoizeDict = new MemoizeDict({
2132
fieldNames: {
2233
label: 'label',
@@ -27,37 +38,23 @@ describe('MemoizeDict', () => {
2738
{
2839
get: (_, key: string) => ({
2940
data: async () => {
30-
return dataFunc(key)
41+
return dataFunc(key);
3142
},
3243
}),
3344
}
3445
),
3546
});
3647

37-
beforeEach(() => {
38-
dataFunc.mockReset();
39-
dataFunc.mockImplementation((dictName: string) => {
40-
return new Promise<DictData[]>((resolve) => {
41-
setTimeout(() => {
42-
resolve(mockData);
43-
}, 100);
44-
});
45-
})
46-
});
47-
4848
it('get()', async () => {
4949
expect(memoizeDict.get('test')).toBeUndefined();
50-
expect(dataFunc).toBeCalledTimes(1);
5150
expect(dataFunc).toHaveBeenCalledWith('test');
52-
53-
await nextTick();
54-
await new Promise((resolve) => setTimeout(resolve, 100));
55-
expect(
56-
memoizeDict.get('test')
57-
).toBe(mockData);
51+
expect(dataFunc).toBeCalledTimes(1);
52+
await new Promise((resolve) => setTimeout(resolve, 101));
53+
expect(memoizeDict.get('test')).toBe(mockData);
5854
expect(dataFunc).toBeCalledTimes(1);
5955
});
6056

57+
6158
it('tree()', async () => {
6259
expect(
6360
memoizeDict.tree('test')
@@ -86,13 +83,15 @@ describe('MemoizeDict', () => {
8683
expect(dataFunc).toBeCalledTimes(0);
8784
});
8885

86+
8987
it('item()', async () => {
9088
expect(
9189
memoizeDict.item('test', 2)
9290
).toEqual({ id: 2, label: 'Item 2', parent: 1 });
9391
expect(dataFunc).toBeCalledTimes(0);
9492
});
9593

94+
9695
it('label()', async () => {
9796
expect(
9897
memoizeDict.label('test', 2)
@@ -114,21 +113,18 @@ describe('MemoizeDict', () => {
114113
expect(dataFunc).toBeCalledTimes(0);
115114
});
116115

116+
117+
117118
it('fetch()', async () => {
118-
expect(
119-
await memoizeDict.fetch('test')
120-
).toBe(mockData);
119+
expect(await memoizeDict.fetch('test')).toBe(mockData);
121120
expect(dataFunc).toBeCalledTimes(0);
122121
});
123122

124123
it('load()', async () => {
125-
expect(
126-
await memoizeDict.load('test')
127-
).toBe(mockData);
124+
expect(await memoizeDict.load('test')).toBe(mockData);
128125
expect(dataFunc).toBeCalledTimes(1);
129126
});
130127

131-
132128
it('clear()', async () => {
133129
memoizeDict.get('test-1');
134130
memoizeDict.get('test-2');
@@ -143,24 +139,28 @@ describe('MemoizeDict', () => {
143139
expect(dataFunc).toBeCalledTimes(4);
144140
});
145141

142+
146143
it('delete()', async () => {
147144
memoizeDict.delete('test')
148145
expect(memoizeDict.get('test')).toBeUndefined();
149146
expect(dataFunc).toBeCalledTimes(1);
150147
await new Promise((resolve) => setTimeout(resolve, 101));
151-
expect(
152-
memoizeDict.get('test')
153-
).toBe(mockData);
148+
expect(memoizeDict.get('test')).toBe(mockData);
154149
});
155150

151+
152+
156153
});
157154

155+
156+
158157
describe('特殊情况的处理', () => {
159158
const mockData = [
160159
{ label: 'Item 1', value: 1, parent: 0 },
161160
{ label: 'Item 2', value: 2, parent: 1 },
162161
{ label: 'Item 3', value: 3, parent: 1 },
163-
{ label: 'Item 999', value: 999, parent: 999 },
162+
{ label: 'Item 999', value: 999, parent: 998 },
163+
{ label: 'Item 888', value: 888, parent: 888 },
164164
]
165165
const memoizeDict = new MemoizeDict({
166166
// fieldNames:{
@@ -185,58 +185,51 @@ describe('特殊情况的处理', () => {
185185

186186
it('data 不是异步函数', async () => {
187187
memoizeDict.tree('test');
188-
await nextTick();
189-
expect(
190-
memoizeDict.get('test')
191-
).toEqual(mockData);
188+
await new Promise((resolve) => setTimeout(resolve, 101));
189+
expect(memoizeDict.get('test')).toEqual(mockData);
192190
});
193191

194192
it('fieldNames 未定义', async () => {
195-
expect(
196-
memoizeDict.treeLabel('test', 2)
197-
).toBe('Item 1-Item 2');
193+
expect(memoizeDict.treeLabel('test', 2)).toBe('Item 1-Item 2');
194+
});
195+
196+
it('dictName 不存在', async () => {
197+
expect(() => memoizeDict.fetch('test-1')).toThrowError('config not found: test-1');
198198
});
199199

200200
it('label() 传的值不存在', async () => {
201-
expect(
202-
memoizeDict.label('test', 99)
203-
).toBe('99');
201+
expect(memoizeDict.label('test', 99)).toBe('99');
204202
});
205203

206204
it('label() 不传值', async () => {
207-
expect(
208-
memoizeDict.label('test', undefined as any)
209-
).toBe('');
205+
expect(memoizeDict.label('test', undefined as any)).toBe('');
210206
});
211207

212208
it('labels() 不传值', async () => {
213-
expect(
214-
memoizeDict.labels('test', undefined as any)
215-
).toEqual([]);
209+
expect(memoizeDict.labels('test', undefined as any)).toEqual([]);
216210
});
217211

218212
it('treeLabel() 不传值', async () => {
219-
expect(
220-
memoizeDict.treeLabel('test', undefined as any)
221-
).toBe('');
213+
expect(memoizeDict.treeLabel('test', undefined as any)).toBe('');
222214
});
223215

216+
224217
it('treeLabel() 传的值父级不存在', async () => {
225-
expect(
226-
memoizeDict.treeLabel('test', 999)
227-
).toBe('Item 999');
218+
await memoizeDict.fetch('test');
219+
expect(memoizeDict.treeLabel('test', 999)).toBe('Item 999');
228220
})
229221

222+
it('treeLabel() 的item的parent等于自己', async () => {
223+
await memoizeDict.fetch('test');
224+
expect(memoizeDict.treeLabel('test', 888)).toBe('Item 888');
225+
});
226+
230227
it('treeLabel() 传的值不存在', async () => {
231-
expect(
232-
memoizeDict.treeLabel('test', 99)
233-
).toBe('99');
228+
expect(memoizeDict.treeLabel('test', 99)).toBe('99');
234229
});
235230

236231
it('values() 不传数组', async () => {
237-
expect(
238-
memoizeDict.labels('test', 2 as any)
239-
).toEqual(2);
232+
expect( memoizeDict.labels('test', 2 as any) ).toEqual(2);
240233
expect(console.error).toBeCalledTimes(1);
241234
});
242235
});

src/index.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@
22

33
import { computedAsync, useMemoize } from "@vueuse/core";
44

5+
// TODO: rslib
6+
// TODO: createMemoizeDict
7+
// function createMemoizeDict() {
8+
// return {
9+
// data: xx,
10+
// toTree: xx,
11+
// fetch: xx,
12+
// load: xx,
13+
// }
14+
// }
515

616
export class MemoizeDict<DictItem = Record<string, unknown>> {
717
private options;
@@ -98,7 +108,7 @@ export class MemoizeDict<DictItem = Record<string, unknown>> {
98108
let fullLabel = this.label(dictName, value);
99109
let currentItem = item;
100110

101-
while (currentItem[this._parentFieldName]) {
111+
while (currentItem[this._parentFieldName] && currentItem[this._parentFieldName] !== currentItem[this._valueFieldName]) {
102112
const parentItem = this.find(dictName, currentItem[this._parentFieldName]);
103113
if (!parentItem) break;
104114
fullLabel = `${this.label(dictName, parentItem[this._labelFieldName])}-${fullLabel}`;
@@ -107,10 +117,6 @@ export class MemoizeDict<DictItem = Record<string, unknown>> {
107117

108118
return fullLabel
109119
}
110-
public fullLabel(...args: Parameters<typeof this.treeLabel>) {
111-
return this.treeLabel(...args);
112-
}
113-
114120

115121
private _fetch(dictName: string): Promise<DictItem[]> & { __computedAsyncRef__?: ReturnType<typeof computedAsync<DictItem[]>> } {
116122
const config = this.options.config[dictName];

0 commit comments

Comments
 (0)