service-stubs.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. import { vi } from 'vitest';
  2. /**
  3. * 创建模拟的用户服务
  4. */
  5. export function createMockUserService() {
  6. return {
  7. getUsersWithPagination: vi.fn().mockResolvedValue([[], 0]),
  8. getUserById: vi.fn().mockResolvedValue(null),
  9. getUserByUsername: vi.fn().mockResolvedValue(null),
  10. getUserByEmail: vi.fn().mockResolvedValue(null),
  11. createUser: vi.fn().mockResolvedValue({ id: 1, username: 'testuser' }),
  12. updateUser: vi.fn().mockResolvedValue({ affected: 1 }),
  13. deleteUser: vi.fn().mockResolvedValue({ affected: 1 }),
  14. changePassword: vi.fn().mockResolvedValue({ affected: 1 }),
  15. verifyPassword: vi.fn().mockResolvedValue(true),
  16. assignRole: vi.fn().mockResolvedValue({ affected: 1 }),
  17. removeRole: vi.fn().mockResolvedValue({ affected: 1 })
  18. };
  19. }
  20. /**
  21. * 创建模拟的认证服务
  22. */
  23. export function createMockAuthService() {
  24. return {
  25. login: vi.fn().mockResolvedValue({
  26. token: 'mock-jwt-token',
  27. user: { id: 1, username: 'testuser' }
  28. }),
  29. logout: vi.fn().mockResolvedValue(undefined),
  30. register: vi.fn().mockResolvedValue({ id: 1, username: 'newuser' }),
  31. verifyToken: vi.fn().mockResolvedValue({ id: 1, username: 'testuser' }),
  32. refreshToken: vi.fn().mockResolvedValue({ token: 'new-mock-jwt-token' }),
  33. forgotPassword: vi.fn().mockResolvedValue({ success: true }),
  34. resetPassword: vi.fn().mockResolvedValue({ success: true })
  35. };
  36. }
  37. /**
  38. * 创建模拟的角色服务
  39. */
  40. export function createMockRoleService() {
  41. return {
  42. getRoles: vi.fn().mockResolvedValue([]),
  43. getRoleById: vi.fn().mockResolvedValue(null),
  44. createRole: vi.fn().mockResolvedValue({ id: 1, name: 'admin' }),
  45. updateRole: vi.fn().mockResolvedValue({ affected: 1 }),
  46. deleteRole: vi.fn().mockResolvedValue({ affected: 1 }),
  47. assignPermission: vi.fn().mockResolvedValue({ affected: 1 }),
  48. removePermission: vi.fn().mockResolvedValue({ affected: 1 })
  49. };
  50. }
  51. /**
  52. * 创建模拟的通用CRUD服务
  53. */
  54. export function createMockCrudService() {
  55. return {
  56. findAll: vi.fn().mockResolvedValue([]),
  57. findOne: vi.fn().mockResolvedValue(null),
  58. create: vi.fn().mockResolvedValue({ id: 1 }),
  59. update: vi.fn().mockResolvedValue({ affected: 1 }),
  60. delete: vi.fn().mockResolvedValue({ affected: 1 }),
  61. count: vi.fn().mockResolvedValue(0),
  62. exists: vi.fn().mockResolvedValue(false)
  63. };
  64. }
  65. /**
  66. * 创建模拟的邮件服务
  67. */
  68. export function createMockEmailService() {
  69. return {
  70. sendWelcomeEmail: vi.fn().mockResolvedValue({ success: true }),
  71. sendPasswordResetEmail: vi.fn().mockResolvedValue({ success: true }),
  72. sendNotification: vi.fn().mockResolvedValue({ success: true }),
  73. verifyEmail: vi.fn().mockResolvedValue({ success: true })
  74. };
  75. }
  76. /**
  77. * 创建模拟的文件服务
  78. */
  79. export function createMockFileService() {
  80. return {
  81. upload: vi.fn().mockResolvedValue({ url: 'https://example.com/file.jpg' }),
  82. download: vi.fn().mockResolvedValue(Buffer.from('test content')),
  83. delete: vi.fn().mockResolvedValue({ success: true }),
  84. getSignedUrl: vi.fn().mockResolvedValue('https://example.com/signed-url')
  85. };
  86. }
  87. /**
  88. * 服务stub工具类
  89. */
  90. export class ServiceStubManager {
  91. private stubs = new Map<string, any>();
  92. /**
  93. * 创建服务stub
  94. */
  95. createStub<T>(serviceName: string, stubImplementation: Partial<T>): T {
  96. const stub = { ...stubImplementation } as T;
  97. this.stubs.set(serviceName, stub);
  98. return stub;
  99. }
  100. /**
  101. * 获取服务stub
  102. */
  103. getStub<T>(serviceName: string): T | undefined {
  104. return this.stubs.get(serviceName);
  105. }
  106. /**
  107. * 重置所有stub
  108. */
  109. resetAll(): void {
  110. this.stubs.clear();
  111. }
  112. /**
  113. * 重置特定stub
  114. */
  115. resetStub(serviceName: string): void {
  116. this.stubs.delete(serviceName);
  117. }
  118. }
  119. /**
  120. * 全局服务stub管理器
  121. */
  122. export const serviceStubs = new ServiceStubManager();
  123. /**
  124. * 设置服务mock
  125. */
  126. export function setupServiceMocks() {
  127. // 用户服务mock
  128. vi.mock('../modules/users/user.service', () => ({
  129. UserService: vi.fn().mockImplementation(() => serviceStubs.createStub('UserService', createMockUserService()))
  130. }));
  131. // 认证服务mock
  132. vi.mock('../modules/auth/auth.service', () => ({
  133. AuthService: vi.fn().mockImplementation(() => serviceStubs.createStub('AuthService', createMockAuthService()))
  134. }));
  135. // 角色服务mock
  136. vi.mock('../modules/roles/role.service', () => ({
  137. RoleService: vi.fn().mockImplementation(() => serviceStubs.createStub('RoleService', createMockRoleService()))
  138. }));
  139. // 通用CRUD服务mock
  140. vi.mock('../../utils/generic-crud.service', () => ({
  141. GenericCRUDService: vi.fn().mockImplementation(() => serviceStubs.createStub('GenericCRUDService', createMockCrudService()))
  142. }));
  143. }