javascript指纹识别异步比对重试逻辑测试核心是模拟异步失败与成功场景,验证重试次数、间隔、终止条件及最终结果;需用jest mock webauthn api、封装可配置重试函数,并覆盖首次成功、失败后成功、达上限失败、非重试错误等关键路径。

JavaScript 中测试指纹识别异步比对重试逻辑,核心是**模拟异步失败与成功场景,并验证重试次数、间隔、终止条件和最终结果是否符合预期**。不能依赖真实硬件(如 WebAuthn 设备),需用 mock 或 stub 替代底层调用。
1. 用 Jest + jest.mock 模拟 WebAuthn API
真实 navigator.credentials.get() 是不可控的异步操作。应将其替换为可控的 mock 函数:
- 返回 Promise 并按需 resolve 或 reject
- 记录调用次数,便于断言重试行为
- 支持注入不同错误类型(如
"NotAllowedError"、"UnknownError")来触发重试分支
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
jest.mock('navigator.credentials', () => ({
get: jest.fn().mockImplementationOnce(() => Promise.reject(new DOMException('User cancelled', 'NotAllowedError')))
.mockImplementationOnce(() => Promise.reject(new DOMException('Timeout', 'UnknownError')))
.mockImplementationOnce(() => Promise.resolve({ id: 'test-finger' }))
}));
2. 封装可重试的比对函数并暴露控制点
不要让重试逻辑深埋在 UI 层。建议封装成独立函数,例如 retryFingerprintMatch(options),并支持:
- maxRetries:最大重试次数(含首次)
-
retryDelay:每次失败后延迟毫秒数(可用
jest.advanceTimersByTime()控制) -
isRetryableError:自定义判断哪些错误该重试(如排除
"SecurityError") - 返回 Promise,同时支持监听
onRetry回调用于测试中收集日志
3. 编写覆盖关键路径的单元测试
每个测试聚焦一个重试行为,避免耦合:
- 首次成功:mock 第一次就 resolve → 验证只调用 1 次、无延迟、返回正确凭证
- 两次失败后成功:mock 前两次 reject、第三次 resolve → 验证调用 3 次、有两次 delay、最终 resolve
- 达到最大重试仍失败:mock 全部 reject → 验证调用次数 = maxRetries、最终 reject、错误为最后一次原因
-
非重试错误立即终止:第一次返回
SecurityError→ 验证只调用 1 次、不重试
4. 验证时间行为(可选但推荐)
若重试含固定延迟(如 1000ms),用 Jest 的 timer mock 精确控制:
-
jest.useFakeTimers()启用虚拟时钟 -
await act(async () => { ... })(配合 React 测试)或await jest.runAllTimers()触发延迟 - 断言
jest.getTimerCount()或累计延迟时间是否匹配预期
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










