service-mocks.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. import { vi } from 'vitest';
  2. /**
  3. * 创建HTTP服务mock
  4. */
  5. export function createHttpServiceMock() {
  6. return {
  7. get: vi.fn().mockResolvedValue({ data: {}, status: 200 }),
  8. post: vi.fn().mockResolvedValue({ data: {}, status: 201 }),
  9. put: vi.fn().mockResolvedValue({ data: {}, status: 200 }),
  10. delete: vi.fn().mockResolvedValue({ data: {}, status: 204 }),
  11. patch: vi.fn().mockResolvedValue({ data: {}, status: 200 }),
  12. };
  13. }
  14. /**
  15. * 创建认证服务mock
  16. */
  17. export function createAuthServiceMock() {
  18. return {
  19. verifyToken: vi.fn().mockResolvedValue({ userId: 1, username: 'testuser' }),
  20. generateToken: vi.fn().mockReturnValue('mock-jwt-token'),
  21. refreshToken: vi.fn().mockResolvedValue({ accessToken: 'new-token', refreshToken: 'new-refresh-token' }),
  22. invalidateToken: vi.fn().mockResolvedValue(undefined),
  23. };
  24. }
  25. /**
  26. * 创建邮件服务mock
  27. */
  28. export function createEmailServiceMock() {
  29. return {
  30. sendWelcomeEmail: vi.fn().mockResolvedValue({ success: true }),
  31. sendPasswordResetEmail: vi.fn().mockResolvedValue({ success: true }),
  32. sendNotification: vi.fn().mockResolvedValue({ success: true }),
  33. };
  34. }
  35. /**
  36. * 创建文件存储服务mock
  37. */
  38. export function createStorageServiceMock() {
  39. return {
  40. uploadFile: vi.fn().mockResolvedValue({ url: 'https://example.com/file.jpg', key: 'file-key' }),
  41. deleteFile: vi.fn().mockResolvedValue({ success: true }),
  42. getFileUrl: vi.fn().mockReturnValue('https://example.com/file.jpg'),
  43. listFiles: vi.fn().mockResolvedValue([]),
  44. };
  45. }
  46. /**
  47. * 创建支付服务mock
  48. */
  49. export function createPaymentServiceMock() {
  50. return {
  51. createPaymentIntent: vi.fn().mockResolvedValue({ clientSecret: 'pi_mock_secret', id: 'pi_mock_id' }),
  52. confirmPayment: vi.fn().mockResolvedValue({ success: true, transactionId: 'txn_mock_id' }),
  53. refundPayment: vi.fn().mockResolvedValue({ success: true, refundId: 'ref_mock_id' }),
  54. };
  55. }
  56. /**
  57. * 创建短信服务mock
  58. */
  59. export function createSmsServiceMock() {
  60. return {
  61. sendVerificationCode: vi.fn().mockResolvedValue({ success: true, messageId: 'sms_mock_id' }),
  62. sendNotification: vi.fn().mockResolvedValue({ success: true, messageId: 'sms_mock_id' }),
  63. };
  64. }
  65. /**
  66. * 创建第三方API服务mock
  67. */
  68. export function createThirdPartyApiMock() {
  69. return {
  70. call: vi.fn().mockResolvedValue({ success: true, data: {} }),
  71. validate: vi.fn().mockResolvedValue({ valid: true, errors: [] }),
  72. webhook: vi.fn().mockResolvedValue({ received: true }),
  73. };
  74. }
  75. /**
  76. * 模拟网络延迟
  77. */
  78. export function mockNetworkDelay(delayMs: number) {
  79. return new Promise(resolve => setTimeout(resolve, delayMs));
  80. }
  81. /**
  82. * 模拟HTTP错误响应
  83. */
  84. export function mockHttpError(status: number, message: string) {
  85. return {
  86. response: {
  87. status,
  88. data: { error: message }
  89. }
  90. };
  91. }
  92. /**
  93. * 模拟超时错误
  94. */
  95. export function mockTimeoutError() {
  96. return new Error('Request timeout');
  97. }
  98. /**
  99. * 模拟网络断开错误
  100. */
  101. export function mockNetworkError() {
  102. return new Error('Network error');
  103. }
  104. /**
  105. * 服务mock工具类
  106. */
  107. export class ServiceMocks {
  108. static http = createHttpServiceMock();
  109. static auth = createAuthServiceMock();
  110. static email = createEmailServiceMock();
  111. static storage = createStorageServiceMock();
  112. static payment = createPaymentServiceMock();
  113. static sms = createSmsServiceMock();
  114. static thirdParty = createThirdPartyApiMock();
  115. /**
  116. * 重置所有mock
  117. */
  118. static resetAll() {
  119. Object.values(this).forEach(service => {
  120. if (service && typeof service === 'object') {
  121. Object.values(service).forEach(mock => {
  122. if (mock && typeof mock === 'function' && 'mockClear' in mock) {
  123. (mock as any).mockClear();
  124. }
  125. });
  126. }
  127. });
  128. }
  129. /**
  130. * 设置所有mock为成功状态
  131. */
  132. static setupForSuccess() {
  133. this.resetAll();
  134. // 所有mock默认已经是成功状态
  135. }
  136. /**
  137. * 设置所有mock为失败状态
  138. */
  139. static setupForFailure() {
  140. this.resetAll();
  141. Object.values(this.http).forEach(mock => mock.mockRejectedValue(mockNetworkError()));
  142. Object.values(this.auth).forEach(mock => mock.mockRejectedValue(new Error('Auth failed')));
  143. Object.values(this.email).forEach(mock => mock.mockRejectedValue(new Error('Email failed')));
  144. Object.values(this.storage).forEach(mock => mock.mockRejectedValue(new Error('Storage failed')));
  145. Object.values(this.payment).forEach(mock => mock.mockRejectedValue(new Error('Payment failed')));
  146. Object.values(this.sms).forEach(mock => mock.mockRejectedValue(new Error('SMS failed')));
  147. Object.values(this.thirdParty).forEach(mock => mock.mockRejectedValue(new Error('Third party failed')));
  148. }
  149. }