concrete-crud.service.test.ts 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { describe, it, expect, vi, beforeEach } from 'vitest';
  2. import { DataSource, ObjectLiteral } from 'typeorm';
  3. import { ConcreteCrudService } from '../../src/services/concrete-crud.service';
  4. // 测试实体类
  5. class TestEntity implements ObjectLiteral {
  6. id!: number;
  7. name!: string;
  8. }
  9. describe('ConcreteCrudService', () => {
  10. let mockDataSource: DataSource;
  11. let concreteService: ConcreteCrudService<TestEntity>;
  12. beforeEach(() => {
  13. mockDataSource = {
  14. getRepository: vi.fn().mockReturnValue({
  15. createQueryBuilder: vi.fn().mockReturnValue({
  16. leftJoinAndSelect: vi.fn().mockReturnThis(),
  17. andWhere: vi.fn().mockReturnThis(),
  18. orderBy: vi.fn().mockReturnThis(),
  19. skip: vi.fn().mockReturnThis(),
  20. take: vi.fn().mockReturnThis(),
  21. getManyAndCount: vi.fn().mockResolvedValue([[], 0])
  22. }),
  23. findOne: vi.fn().mockResolvedValue(null),
  24. create: vi.fn().mockImplementation((data) => ({ ...data, id: 1 })),
  25. save: vi.fn().mockImplementation((entity) => Promise.resolve(entity)),
  26. update: vi.fn().mockResolvedValue({ affected: 1 }),
  27. delete: vi.fn().mockResolvedValue({ affected: 1 })
  28. })
  29. } as any;
  30. concreteService = new ConcreteCrudService(TestEntity);
  31. });
  32. describe('构造函数', () => {
  33. it('应该正确初始化父类', () => {
  34. expect(concreteService).toBeDefined();
  35. expect(mockDataSource.getRepository).toHaveBeenCalledWith(TestEntity);
  36. });
  37. it('应该支持用户跟踪选项', () => {
  38. const serviceWithTracking = new ConcreteCrudService(
  39. TestEntity,
  40. { userTracking: { createdByField: 'creator' } }
  41. );
  42. expect(serviceWithTracking).toBeDefined();
  43. });
  44. it('应该支持关联字段选项', () => {
  45. const serviceWithRelations = new ConcreteCrudService(
  46. TestEntity,
  47. { relationFields: { relatedIds: { relationName: 'related', targetEntity: TestEntity } } }
  48. );
  49. expect(serviceWithRelations).toBeDefined();
  50. });
  51. });
  52. describe('继承的方法', () => {
  53. it('应该能够调用 getList 方法', async () => {
  54. const [data, total] = await concreteService.getList(1, 10);
  55. expect(data).toEqual([]);
  56. expect(total).toBe(0);
  57. });
  58. it('应该能够调用 getById 方法', async () => {
  59. const result = await concreteService.getById(1);
  60. expect(result).toBeNull();
  61. });
  62. it('应该能够调用 create 方法', async () => {
  63. const createData = { name: 'Test Entity' };
  64. const result = await concreteService.create(createData);
  65. expect(result).toBeDefined();
  66. expect(result.id).toBe(1);
  67. });
  68. it('应该能够调用 update 方法', async () => {
  69. const updateData = { name: 'Updated Entity' };
  70. const result = await concreteService.update(1, updateData);
  71. expect(result).toBeNull(); // 因为模拟的 findOne 返回 null
  72. });
  73. it('应该能够调用 delete 方法', async () => {
  74. const result = await concreteService.delete(1);
  75. expect(result).toBe(true);
  76. });
  77. });
  78. });