You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Jest mock react-native的Appearance模块解决单元测试报错问题

正确解法

核心逻辑是mock react-native 模块时保留原有全部内置内容,仅覆盖Appearance相关的API,避免丢失其他原生模块方法。

单测试文件生效

在测试文件的最顶部(所有import语句之前)加入以下代码:

jest.mock('react-native', () => {
  // 引入react-native原有所有模块内容
  const originalRN = jest.requireActual('react-native');
  return {
    ...originalRN,
    Appearance: {
      // 保留Appearance的原有其他属性
      ...originalRN.Appearance,
      // mock你用到的方法
      getColorScheme: jest.fn(() => 'light'),
      useColorScheme: jest.fn(() => 'light'),
      // 如果用到监听方法也可以一起mock
      addChangeListener: jest.fn(),
      removeChangeListener: jest.fn(),
    },
  };
});

测试过程中可以随时切换返回值:

import { Appearance } from 'react-native';

// 测试深色模式场景
test('测试深色主题适配逻辑', () => {
  Appearance.getColorScheme.mockReturnValueOnce('dark');
  // 此处写你的测试逻辑
});

// 测试浅色模式场景
test('测试浅色主题适配逻辑', () => {
  Appearance.getColorScheme.mockReturnValueOnce('light');
  // 此处写你的测试逻辑
});

全局所有测试生效

如果需要所有测试都默认mock Appearance,把上面的jest.mock逻辑放到jest配置的全局初始化文件中即可:

  1. 打开jest.config.js,找到setupFilesAfterEnv配置项,加入你的初始化文件路径(比如./jest-setup.js)
  2. 在jest-setup.js中写入上面的jest.mock代码,之后所有测试都会自动生效。

之前方案的错误原因

  • mockComponent是用来mock原生UI组件的工具,不适用Appearance这种纯API类型的模块
  • 直接重写整个react-native的返回值会覆盖掉所有原有内置方法,导致requireNativeComponent这类系统方法丢失报错,使用jest.requireActual保留原有内容即可避免该问题。

内容的提问来源于stack exchange,提问作者Sarcadass

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:15:04