模拟 Capacitor 插件
在编写应用单元测试时,最佳实践是为被测单元的所有外部依赖创建模拟对象。这包括组件或服务所使用的 Capacitor 插件。
大多数模拟库通过将对象封装在 JavaScript 代理中来创建模拟,这样可以检查对该对象方法的调用并控制方法返回值。然而 Capacitor 插件在 JavaScript 层本身就是通过代理实现的。对代理再创建代理是不被支持的,会导致失败。这时可以使用手动模拟来解决这个问题。
手动模拟
手动模拟允许开发者轻松地模拟整个 JavaScript 模块的功能。因此,当测试代码执行 import { Storage } from '@capacitor/storage'
时,不会加载真正的 Storage
JavaScript 代理对象,而是加载类似这样的模拟对象:
export const Storage = {
async get(data: { key: string }): Promise<{ value: string | undefined }> {
return { value: undefined };
},
async set(data: { key: string; value: string }): Promise<void> {},
async clear(): Promise<void> {},
};
由于这是一个普通的 JavaScript 对象而非代理对象,很容易进行监视。同时作为模拟对象,它不会尝试进行任何原生调用。这使得手动模拟成为测试使用 Capacitor 插件代码的理想选择。
Jest 测试框架
Jest 测试框架内置了对手动模拟的支持。在项目根目录创建 __mocks__/@capacitor
文件夹,Jest 会自动从这里而非 node_modules
加载文件。
例如,假设有以下目录结构:
.
|
+- __mocks__
| |
| +- @capacitor
| |
| +- storage.ts
| +- toast.ts
...
+- src
测试将使用 storage.ts
和 toast.ts
中定义的桩代码,而非 node_modules
中的真实 @capacitor/storage
和 @capacitor/toast
插件。
Jasmine 测试框架
Jasmine 测试框架没有内置"手动模拟"