- DataBuffer: 离线持久化缓冲(分桶存储 + 去重 + 容量管理) - GenericBleAdapter: 基于 Bluetooth SIG 标准 Health Profile 的通用适配器 (Heart Rate 0x180D / Health Thermometer 0x1809 / Blood Pressure 0x1810) - DataSyncScheduler: 定时自动同步调度(基于时间间隔判断是否需要同步) - BLEManager: 集成 DataBuffer 替换简单 Storage 缓存 - device-sync 页面: 注册 CustomBandAdapter + 自动同步 + 状态显示 - 新增 vitest 单元测试配置,30 个测试全部通过
70 lines
2.5 KiB
TypeScript
70 lines
2.5 KiB
TypeScript
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
|
|
// 使用 vi.hoisted 确保 storage 在 mock 提升前可用
|
|
const { storage } = vi.hoisted(() => ({
|
|
storage: new Map<string, string>(),
|
|
}));
|
|
|
|
vi.mock('@tarojs/taro', () => ({
|
|
default: {
|
|
openBluetoothAdapter: vi.fn().mockResolvedValue({}),
|
|
closeBluetoothAdapter: vi.fn().mockResolvedValue({}),
|
|
startBluetoothDevicesDiscovery: vi.fn().mockResolvedValue({}),
|
|
stopBluetoothDevicesDiscovery: vi.fn().mockResolvedValue({}),
|
|
onBluetoothDeviceFound: vi.fn(),
|
|
offBluetoothDeviceFound: vi.fn(),
|
|
createBLEConnection: vi.fn().mockResolvedValue({}),
|
|
closeBLEConnection: vi.fn().mockResolvedValue({}),
|
|
getBLEDeviceServices: vi.fn().mockResolvedValue({ services: [] }),
|
|
getBLEDeviceCharacteristics: vi.fn().mockResolvedValue({ characteristics: [] }),
|
|
notifyBLECharacteristicValueChange: vi.fn().mockResolvedValue({}),
|
|
onBLECharacteristicValueChange: vi.fn(),
|
|
onBLEConnectionStateChange: vi.fn(),
|
|
getStorageSync: vi.fn((key: string) => storage.get(key) || ''),
|
|
setStorageSync: vi.fn((key: string, value: string) => { storage.set(key, value); }),
|
|
removeStorageSync: vi.fn((key: string) => { storage.delete(key); }),
|
|
},
|
|
}));
|
|
|
|
import { BLEManager } from '@/services/ble/BLEManager';
|
|
import { XiaomiBandAdapter } from '@/services/ble/adapters/XiaomiBandAdapter';
|
|
|
|
describe('BLEManager DataBuffer 集成', () => {
|
|
let manager: BLEManager;
|
|
|
|
beforeEach(() => {
|
|
storage.clear();
|
|
manager = new BLEManager();
|
|
manager.registerAdapter(XiaomiBandAdapter);
|
|
});
|
|
|
|
afterEach(async () => {
|
|
await manager.destroy();
|
|
});
|
|
|
|
it('registerAdapter 添加适配器', () => {
|
|
const count = (manager as any).adapters.length;
|
|
expect(count).toBeGreaterThanOrEqual(1);
|
|
});
|
|
|
|
it('getCachedReadings 返回空数组(未连接时)', () => {
|
|
const readings = manager.getCachedReadings();
|
|
expect(readings).toEqual([]);
|
|
});
|
|
|
|
it('flushPendingReadings 无缓存时返回 0', async () => {
|
|
const uploadFn = vi.fn().mockResolvedValue(0);
|
|
const count = await manager.flushPendingReadings(uploadFn);
|
|
expect(count).toBe(0);
|
|
expect(uploadFn).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it('DataBuffer 实例已初始化', () => {
|
|
const buffer = (manager as any).dataBuffer;
|
|
expect(buffer).toBeDefined();
|
|
expect(typeof buffer.push).toBe('function');
|
|
expect(typeof buffer.flush).toBe('function');
|
|
expect(typeof buffer.restore).toBe('function');
|
|
});
|
|
});
|