Skip to content

Commit 2e76b3c

Browse files
authored
⚡️ 单元测试优化(错误修正,注入修正,concurrent,加速) (#904)
* 单元测试优化(错误修正,注入修正,concurrent,加速) * 统一 `vitest.test` -> `vitest.it` * #903 * 代码修正
1 parent 0627a0f commit 2e76b3c

32 files changed

+1341
-984
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"private": true,
88
"scripts": {
99
"preinstall": "pnpm dlx only-allow pnpm",
10-
"test": "vitest",
10+
"test": "vitest --test-timeout=500 --no-coverage --isolate=false --reporter=verbose",
1111
"coverage": "vitest run --coverage",
1212
"build": "cross-env NODE_ENV=production rspack build",
1313
"dev": "cross-env NODE_ENV=development rspack",

packages/chrome-extension-mock/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,5 @@ const chromeMock = {
2626
userScripts: new MockUserScripts(),
2727
init() {},
2828
};
29-
// @ts-ignore
30-
global.chrome = chromeMock;
3129

3230
export default chromeMock;

packages/chrome-extension-mock/runtime.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ type Port = chrome.runtime.Port & {
44
};
55

66
export default class Runtime {
7+
id = "kfjdomqetnlhbgxasrwzypcviueotmlr";
78
connectListener: Array<(port: chrome.runtime.Port) => void> = [];
89

910
messageListener: Array<(message: any) => void> = [];
@@ -64,8 +65,8 @@ export default class Runtime {
6465
return port;
6566
}
6667

67-
getURL(path: string) {
68-
return `${window.location.href}${path}`;
68+
getURL(_path: string) {
69+
// implemented with vitest
6970
}
7071

7172
sendMessage(message: any, callback?: (response: any) => void) {

packages/message/message_queue.test.ts

Lines changed: 87 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,6 @@
11
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
22
import { MessageQueue, MessageQueueGroup, type IMessageQueue } from "./message_queue";
33

4-
// Mock chrome.runtime
5-
global.chrome = {
6-
runtime: {
7-
onMessage: {
8-
addListener: vi.fn(),
9-
},
10-
sendMessage: vi.fn(),
11-
lastError: null,
12-
},
13-
} as any;
14-
154
// Mock LoggerCore
165
vi.mock("@App/app/logger/core", () => ({
176
default: {
@@ -23,6 +12,8 @@ vi.mock("@App/app/logger/core", () => ({
2312
},
2413
}));
2514

15+
const nextTick = () => Promise.resolve().then(() => {});
16+
2617
describe("MessageQueueGroup", () => {
2718
let messageQueue: IMessageQueue;
2819

@@ -36,55 +27,62 @@ describe("MessageQueueGroup", () => {
3627
});
3728

3829
describe("基本功能测试", () => {
39-
it("应该能够创建分组", () => {
40-
const group = messageQueue.group("test");
30+
it.concurrent("应该能够创建分组", () => {
31+
const group = messageQueue.group("api-group");
4132
expect(group).toBeInstanceOf(MessageQueueGroup);
4233
});
4334

44-
it("应该能够在分组中订阅和发布消息", () => {
45-
const group = messageQueue.group("api");
35+
it.concurrent("应该能够在分组中订阅和发布消息", () => {
36+
const group = messageQueue.group("api-sendBasic");
4637
const handler = vi.fn();
4738

48-
group.subscribe("user", handler);
49-
group.emit("user", { id: 1, name: "test" });
39+
group.subscribe("user1", handler);
40+
group.emit("user1", { id: 1, name: "test" });
5041

5142
expect(handler).toHaveBeenCalledWith({ id: 1, name: "test" });
5243
});
5344

54-
it("应该自动为分组名称添加斜杠", () => {
45+
it.concurrent("应该自动为分组名称添加斜杠", () => {
5546
const group1 = messageQueue.group("group1");
5647
const group2 = messageQueue.group("group2/");
5748

5849
const handler1 = vi.fn();
5950
const handler2 = vi.fn();
51+
const handler3 = vi.fn();
52+
const handler4 = vi.fn();
6053

61-
group1.subscribe("test", handler1);
62-
group2.subscribe("test", handler2);
54+
group1.subscribe("test1", handler1);
55+
group2.subscribe("test1", handler2);
56+
group1.subscribe("test2", handler3);
57+
group2.subscribe("test2", handler4);
6358

6459
// 直接通过 messageQueue 发布消息来验证主题名称
65-
messageQueue.emit("group1/test", "message1");
66-
messageQueue.emit("group2/test", "message2");
60+
messageQueue.emit("group1/test1", "message1");
61+
messageQueue.emit("group2/test1", "message2");
6762

6863
expect(handler1).toHaveBeenCalledWith("message1");
6964
expect(handler2).toHaveBeenCalledWith("message2");
65+
66+
expect(handler3).not.toHaveBeenCalled();
67+
expect(handler4).not.toHaveBeenCalled();
7068
});
7169

72-
it("应该能够创建嵌套分组", () => {
73-
const apiGroup = messageQueue.group("api");
74-
const userGroup = apiGroup.group("user");
70+
it.concurrent("应该能够创建嵌套分组", () => {
71+
const apiGroup = messageQueue.group("api-groupNested");
72+
const userGroup = apiGroup.group("user2");
7573
const profileGroup = userGroup.group("profile");
7674

7775
const handler = vi.fn();
78-
profileGroup.subscribe("get", handler);
76+
profileGroup.subscribe("get1", handler);
7977

80-
profileGroup.emit("get", { userId: 123 });
78+
profileGroup.emit("get1", { userId: 123 });
8179

8280
expect(handler).toHaveBeenCalledWith({ userId: 123 });
8381
});
8482
});
8583

8684
describe("中间件功能测试", () => {
87-
it("应该能够添加和执行中间件", async () => {
85+
it.concurrent("应该能够添加和执行中间件", async () => {
8886
const middlewareOrder: string[] = [];
8987

9088
const middleware = vi.fn((topic: string, message: any, next: () => void) => {
@@ -93,26 +91,26 @@ describe("MessageQueueGroup", () => {
9391
middlewareOrder.push("middleware-after");
9492
});
9593

96-
const group = messageQueue.group("api", middleware);
94+
const group = messageQueue.group("api-middleware", middleware);
9795

9896
const handler = vi.fn(() => {
99-
middlewareOrder.push("handler");
97+
middlewareOrder.push("handler-middle");
10098
});
10199

102-
group.subscribe("test", handler);
100+
group.subscribe("good", handler);
103101

104102
// 等待异步操作
105-
group.emit("test", { data: "test" });
103+
group.emit("good", { data: "bye" });
106104

107-
// 使用 setTimeout 确保异步操作完成
108-
await new Promise((resolve) => setTimeout(resolve, 0));
105+
await nextTick();
106+
await nextTick();
109107

110-
expect(middlewareOrder).toEqual(["middleware-before", "handler", "middleware-after"]);
111-
expect(middleware).toHaveBeenCalledWith("api/test", { data: "test" }, expect.any(Function));
112-
expect(handler).toHaveBeenCalledWith({ data: "test" });
108+
expect(middlewareOrder).toEqual(["middleware-before", "handler-middle", "middleware-after"]);
109+
expect(middleware).toHaveBeenCalledWith("api-middleware/good", { data: "bye" }, expect.any(Function));
110+
expect(handler).toHaveBeenCalledWith({ data: "bye" });
113111
});
114112

115-
it("应该能够使用 use 方法添加中间件", async () => {
113+
it.concurrent("应该能够使用 use 方法添加中间件", async () => {
116114
const middlewareOrder: string[] = [];
117115

118116
const middleware1 = vi.fn((topic: string, message: any, next: () => void) => {
@@ -127,27 +125,28 @@ describe("MessageQueueGroup", () => {
127125
middlewareOrder.push("middleware2-after");
128126
});
129127

130-
const group = messageQueue.group("api").use(middleware1).use(middleware2);
128+
const group = messageQueue.group("group-08").use(middleware1).use(middleware2);
131129

132130
const handler = vi.fn(() => {
133-
middlewareOrder.push("handler");
131+
middlewareOrder.push("handler-08");
134132
});
135133

136-
group.subscribe("test", handler);
137-
group.emit("test", { data: "test" });
134+
group.subscribe("test-08", handler);
135+
group.emit("test-08", { data: "test-08" });
138136

139-
await new Promise((resolve) => setTimeout(resolve, 0));
137+
await nextTick();
138+
await nextTick();
140139

141140
expect(middlewareOrder).toEqual([
142141
"middleware1-before",
143142
"middleware2-before",
144-
"handler",
143+
"handler-08",
145144
"middleware2-after",
146145
"middleware1-after",
147146
]);
148147
});
149148

150-
it("子分组应该继承父分组的中间件", async () => {
149+
it.concurrent("子分组应该继承父分组的中间件", async () => {
151150
const middlewareOrder: string[] = [];
152151

153152
const parentMiddleware = vi.fn((topic: string, message: any, next: () => void) => {
@@ -164,108 +163,112 @@ describe("MessageQueueGroup", () => {
164163
const childGroup = parentGroup.group("child", childMiddleware);
165164

166165
const handler = vi.fn(() => {
167-
middlewareOrder.push("handler");
166+
middlewareOrder.push("handler-09");
168167
});
169168

170-
childGroup.subscribe("test", handler);
171-
childGroup.emit("test", { data: "test" });
169+
childGroup.subscribe("test-09", handler);
170+
childGroup.emit("test-09", { data: "test-09" });
172171

173-
await new Promise((resolve) => setTimeout(resolve, 0));
172+
await nextTick();
173+
await nextTick();
174174

175-
expect(middlewareOrder).toEqual(["parent-middleware", "child-middleware", "handler"]);
175+
expect(middlewareOrder).toEqual(["parent-middleware", "child-middleware", "handler-09"]);
176176
});
177177

178-
it("应该支持异步中间件", async () => {
178+
it.concurrent("应该支持异步中间件", async () => {
179179
const asyncMiddleware = vi.fn(async (topic: string, message: any, next: () => void) => {
180-
await new Promise((resolve) => setTimeout(resolve, 10));
180+
await nextTick();
181181
next();
182182
});
183183

184-
const group = messageQueue.group("api", asyncMiddleware);
184+
const group = messageQueue.group("api-middlewareAsync", asyncMiddleware);
185185
const handler = vi.fn();
186186

187-
group.subscribe("test", handler);
188-
group.emit("test", { data: "test" });
187+
group.subscribe("test4", handler);
188+
group.emit("test4", { data: "test4" });
189189

190190
// 等待异步操作完成
191-
await new Promise((resolve) => setTimeout(resolve, 20));
191+
await nextTick();
192+
await nextTick();
192193

193194
expect(asyncMiddleware).toHaveBeenCalled();
194-
expect(handler).toHaveBeenCalledWith({ data: "test" });
195+
expect(handler).toHaveBeenCalledWith({ data: "test4" });
195196
});
196197
});
197198

198199
describe("发布方法测试", () => {
199-
it("publish 方法应该使用 chrome.runtime.sendMessage", () => {
200-
const group = messageQueue.group("api");
200+
it.concurrent("publish 方法应该使用 chrome.runtime.sendMessage", () => {
201+
const group = messageQueue.group("api-sendChromeMessage");
201202

202-
group.publish("test", { data: "test" });
203+
const sendSpy = vi.spyOn(chrome.runtime, "sendMessage");
204+
group.publish("test-sendChromeMessage", { data: "test-sendChromeMessage" });
203205

204-
expect(chrome.runtime.sendMessage).toHaveBeenCalledWith({
205-
msgQueue: "api/test",
206-
data: { action: "message", message: { data: "test" } },
206+
expect(sendSpy).toHaveBeenCalledWith({
207+
msgQueue: "api-sendChromeMessage/test-sendChromeMessage",
208+
data: { action: "message", message: { data: "test-sendChromeMessage" } },
207209
});
208210
});
209211

210-
it("emit 方法应该只在本地发布", () => {
211-
const group = messageQueue.group("api");
212+
it.concurrent("emit 方法应该只在本地发布", () => {
213+
const group = messageQueue.group("api-emitLocal");
212214
const handler = vi.fn();
213215

214-
group.subscribe("test", handler);
215-
group.emit("test", { data: "test" });
216+
const sendSpy = vi.spyOn(chrome.runtime, "sendMessage");
217+
group.subscribe("test-emitLocal", handler);
218+
group.emit("test-emitLocal", { data: "test-emitLocal" });
216219

217-
expect(handler).toHaveBeenCalledWith({ data: "test" });
218-
expect(chrome.runtime.sendMessage).not.toHaveBeenCalled();
220+
expect(handler).toHaveBeenCalledWith({ data: "test-emitLocal" });
221+
expect(sendSpy).not.toHaveBeenCalled();
219222
});
220223
});
221224

222225
describe("取消订阅功能", () => {
223-
it("应该能够取消订阅", () => {
224-
const group = messageQueue.group("api");
226+
it.concurrent("应该能够取消订阅", () => {
227+
const group = messageQueue.group("api-unsubscribe");
225228
const handler = vi.fn();
226229

227-
const unsubscribe = group.subscribe("test", handler);
230+
const unsubscribe = group.subscribe("test-unsubscribe", handler);
228231

229232
// 发布消息,应该收到
230-
group.emit("test", { data: "test1" });
233+
group.emit("test-unsubscribe", { data: "test1" });
231234
expect(handler).toHaveBeenCalledWith({ data: "test1" });
232235

233236
// 取消订阅
234237
unsubscribe();
235238

236239
// 再次发布消息,不应该收到
237-
group.emit("test", { data: "test2" });
240+
group.emit("test-unsubscribe", { data: "test2" });
238241
expect(handler).toHaveBeenCalledTimes(1);
239242
});
240243
});
241244

242245
describe("边界情况测试", () => {
243-
it("没有中间件的分组应该正常工作", () => {
244-
const group = messageQueue.group("api");
246+
it.concurrent("没有中间件的分组应该正常工作", () => {
247+
const group = messageQueue.group("api-groupNoMiddleware");
245248
const handler = vi.fn();
246249

247-
group.subscribe("test", handler);
248-
group.emit("test", { data: "test" });
250+
group.subscribe("test-groupNoMiddleware", handler);
251+
group.emit("test-groupNoMiddleware", { data: "test-groupNoMiddleware" });
249252

250-
expect(handler).toHaveBeenCalledWith({ data: "test" });
253+
expect(handler).toHaveBeenCalledWith({ data: "test-groupNoMiddleware" });
251254
});
252255

253-
it("应该能够处理复杂的数据类型", () => {
254-
const group = messageQueue.group("api");
256+
it.concurrent("应该能够处理复杂的数据类型", () => {
257+
const group = messageQueue.group("api-complexPayload");
255258
const handler = vi.fn();
256259

257260
const complexData = {
258261
array: [1, 2, 3],
259262
object: { nested: true },
260263
number: 42,
261-
string: "test",
264+
string: "test-complexPayload",
262265
boolean: true,
263266
null: null,
264267
undefined: undefined,
265268
};
266269

267-
group.subscribe("test", handler);
268-
group.emit("test", complexData);
270+
group.subscribe("test-complexPayload", handler);
271+
group.emit("test-complexPayload", complexData);
269272

270273
expect(handler).toHaveBeenCalledWith(complexData);
271274
});

0 commit comments

Comments
 (0)