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

如何测试React Native中基于Realm实现的数据库?

解决Realm导入的SyntaxError错误

步骤1:调整Jest的transformIgnorePatterns配置

修改package.json中的Jest配置,将realm和@realm/.*加入到不被忽略转换的列表中,确保Jest会用Babel处理Realm的代码:

"jest": {
  "preset": "jest-expo",
  "transformIgnorePatterns": [
    "node_modules/(?!((jest-)?react-native|@react-native(-community)?|expo(nent)?|@expo(nent)?/.*|@expo-google-fonts/.*|react-navigation|@react-navigation/.*|@sentry/react-native|native-base|react-native-svg|realm|@realm/.*))"
  ]
}

步骤2:检查Babel配置(可选)

如果调整后仍报错,确保你的babel.config.js包含必要的预设和插件:

module.exports = function(api) {
  api.cache(true);
  return {
    presets: ['babel-preset-expo'],
    plugins: ['@babel/plugin-transform-modules-commonjs']
  };
};

安装缺失的依赖(如果需要):

npm install --save-dev @babel/plugin-transform-modules-commonjs

编写addRecord/editRecord/deleteRecord的测试用例

使用内存Realm实例进行测试,避免影响真实数据,同时保证测试的独立性:

测试文件示例(realm.test.js)

import Realm from 'realm';
import { exercises } from './path-to-your-schema-file'; // 导入你的表结构
import { addRecord, editRecord, deleteRecord } from './path-to-your-functions-file'; // 导入待测试函数

// 全局声明Realm实例,用于测试前后的初始化和清理
let realm;

// 每个测试前创建内存Realm
beforeEach(async () => {
  realm = await Realm.open({
    schema: [exercises],
    inMemory: true, // 内存数据库,测试后自动销毁
  });
});

// 每个测试后关闭Realm
afterEach(() => {
  if (realm && !realm.isClosed) {
    realm.close();
  }
});

// 测试addRecord
test('addRecord 能成功插入新的训练记录', () => {
  const testExercise = {
    id: 1,
    name: '俯卧撑',
    type: '力量训练',
    notes: '每组10次,做3组',
    video: new Uint8Array([1, 2, 3]),
  };

  // 调用待测试函数
  addRecord(realm, testExercise);

  // 验证记录是否插入成功
  const savedRecord = realm.objects('table').filtered('id = 1')[0];
  expect(savedRecord).toBeDefined();
  expect(savedRecord.name).toBe(testExercise.name);
  expect(savedRecord.type).toBe(testExercise.type);
});

// 测试editRecord
test('editRecord 能成功更新已有训练记录', () => {
  // 先插入一条初始记录
  const initialData = {
    id: 1,
    name: '俯卧撑',
    type: '力量训练',
    notes: '旧备注',
    video: new Uint8Array([1, 2, 3]),
  };
  realm.write(() => {
    realm.create('table', initialData);
  });

  // 准备更新数据
  const updatedData = {
    id: 1,
    name: '标准俯卧撑',
    notes: '每组12次,做4组',
  };

  // 调用待测试函数
  editRecord(realm, updatedData);

  // 验证记录是否更新成功
  const updatedRecord = realm.objects('table').filtered('id = 1')[0];
  expect(updatedRecord.name).toBe(updatedData.name);
  expect(updatedRecord.notes).toBe(updatedData.notes);
  // 未修改的字段应保持原值
  expect(updatedRecord.type).toBe(initialData.type);
});

// 测试deleteRecord
test('deleteRecord 能成功删除指定训练记录', () => {
  // 先插入一条测试记录
  const testExercise = {
    id: 1,
    name: '俯卧撑',
    type: '力量训练',
    notes: '测试备注',
    video: new Uint8Array([1, 2, 3]),
  };
  realm.write(() => {
    realm.create('table', testExercise);
  });

  // 调用待测试函数
  deleteRecord(realm, 1); // 假设函数接收Realm实例和记录ID

  // 验证记录是否被删除
  const remainingRecords = realm.objects('table').filtered('id = 1');
  expect(remainingRecords.length).toBe(0);
});

待测试函数示例(供参考)

确保你的CRUD函数能接收Realm实例并正确处理事务:

// 添加记录
export const addRecord = (realm, data) => {
  realm.write(() => {
    realm.create('table', data);
  });
};

// 编辑记录
export const editRecord = (realm, data) => {
  realm.write(() => {
    realm.create('table', data, true); // 第三个参数true表示覆盖更新
  });
};

// 删除记录
export const deleteRecord = (realm, id) => {
  realm.write(() => {
    const record = realm.objects('table').filtered('id = $0', id)[0];
    if (record) {
      realm.delete(record);
    }
  });
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 21:35:21