如何测试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
相关产品推荐
相关产品推荐

