在Expo模块中模拟原生调用

编辑

了解在Expo模块中模拟原生调用。


在Expo项目中编写单元测试的推荐方法是使用 Jestjest-expo 预设。

要为使用原生代码的应用编写单元测试,需要模拟原生调用。
模拟一词的意思是用一个不执行任何操作的假版本来替换函数的实际实现。这种方法有助于在本地计算机上运行单元测试,因为它绕过了只能在设备上使用的原生代码,任何在本地机器上调用原生函数的代码都将无法工作。

Expo SDK 包含了我们每个社区包的默认模拟集。您也可以使用内置的 Jest API(如 mock functions)自行模拟任何 JS 代码。

但是,为了在您的 Expo 模块中提供默认模拟,我们提供了一种将其打包的方法。这确保了当您的模块用户运行单元测试时,他们将自动使用模拟实现。

为模块提供模拟

创建一个与您要模拟的原生模块同名的文件,并将其放在模块的 mocks 目录中。确保从该文件中导出模拟实现。
jest-expo 预设将在单元测试期间因为一个 requireNativeModule 调用而自动返回导出的函数。

例如,expo-clipboard 库有一个名为 ExpoClipboard 的原生模块。您将在 mocks 目录中创建一个 ExpoClipboard.ts 文件来模拟它。

ExpoClipboard.ts
export async function hasStringAsync(): Promise<boolean> { return false; }

现在,在单元测试中,调用 ExpoClipboard.hasStringAsync() 返回 false

自动生成模拟

如果原生模块有多个方法,维护原生模块的模拟可能会很繁琐。为了简化这个过程,我们提供了一个脚本,可以自动为模块中的所有原生函数生成模拟。
它基于您的模块中的 Swift 实现,支持生成 TypeScript 和 JavaScript 的模拟。

要使用此脚本,您需要安装 SourceKitten 框架。然后,导航到模块目录(即您的模块的 expo-module.config.json 所在的位置),并运行 generate-ts-mocks 命令。

Terminal
brew install sourcekitten
npx expo-modules-test-core generate-ts-mocks

上述命令将在您的模块的 mocks 目录中生成 ExpoModuleName.ts。它包含模块中每个原生方法和视图的模拟实现。

提示: 您还可以运行 generate-js-mocks 以生成 JavaScript 模拟。

更多

使用Jest进行单元测试

了解如何设置和配置 jest-expo 包,以便为项目编写单元测试和快照测试。