跳到主要内容

测试(Mock)

本库依赖 react-native-vision-camera 等 native 模块,jest 环境无法直接加载。消费者在测试里 mock 本库:

jest.mock('@unif/react-native-camera', () =>
require('@unif/react-native-camera/mock')
);

mock 后 useCamera() 返回 [api, null]api.open / api.closejest.fnopen 默认 resolve { code: 0, data: [], message: 'cancelled' }

覆盖单次返回

按需用 mockResolvedValueOnce 覆盖 open 的返回值:

const [api] = useCamera();
(api.open as jest.Mock).mockResolvedValueOnce({
code: 200,
data: [
{
id: '1700000000000-0',
cameraType: 'back',
cameraMode: 'single',
path: '/x.jpg',
uri: 'file:///x.jpg',
width: 1,
height: 1,
mime: 'image/jpeg',
mode: 'single',
},
],
message: 'ok',
});

工具函数与类型

工具函数(toFileUri / buildPhotoFile 等)与所有类型在 mock 中保留真实实现,无需额外 stub。

完整示例

import { useCamera } from '@unif/react-native-camera';

jest.mock('@unif/react-native-camera', () =>
require('@unif/react-native-camera/mock')
);

describe('拍照流程', () => {
it('用户取消时 code 为 0', async () => {
const [api] = useCamera();
// open 默认 resolve { code: 0, data: [], message: 'cancelled' }
const result = await api.open({ cameraMode: [{ mode: 'single' }], dataRetainedMode: 'clear' });
expect(result.code).toBe(0);
});

it('拍照成功时返回文件列表', async () => {
const [api] = useCamera();
(api.open as jest.Mock).mockResolvedValueOnce({
code: 200,
data: [
{
id: '1700000000000-0',
cameraType: 'back',
cameraMode: 'single',
path: '/x.jpg',
uri: 'file:///x.jpg',
width: 1,
height: 1,
mime: 'image/jpeg',
mode: 'single',
},
],
message: 'ok',
});
const result = await api.open({ cameraMode: [{ mode: 'single' }], dataRetainedMode: 'clear' });
expect(result.code).toBe(200);
expect(result.data).toHaveLength(1);
});
});