Permissions Expo TypeError的Jest模拟权限:无法读取属性';askAsync';未定义的
我正在模拟expo和权限模块,但调用Permissions.AskAsync Permissions时未定义 问题看起来像这个问题 使用提供的答案,但不起作用 我嘲笑了axios,它可以工作。对expo模块执行同样的操作不起作用 我要测试的功能:Permissions Expo TypeError的Jest模拟权限:无法读取属性';askAsync';未定义的,permissions,mocking,jestjs,expo,Permissions,Mocking,Jestjs,Expo,我正在模拟expo和权限模块,但调用Permissions.AskAsync Permissions时未定义 问题看起来像这个问题 使用提供的答案,但不起作用 我嘲笑了axios,它可以工作。对expo模块执行同样的操作不起作用 我要测试的功能: checkPermission = async () => { const {statusCamera} = await Permissions.askAsync(Permissions.CAMERA);
checkPermission = async () => {
const {statusCamera} = await Permissions.askAsync(Permissions.CAMERA);
// console.log(statusCamera);
this.setState({cameraPermission: statusCamera});
const {statusCameraRoll} = await Permissions.askAsync(Permissions.CAMERA_ROLL);
this.setState({cameraRollPermission: statusCameraRoll});
};
测试:
describe("Test the Permission function", () => {
it('should return rejected permission.', async function () {
const wrapper = shallow(<Photo2/>);
const instance = wrapper.instance();
await instance.checkPermission();
expect(instance.state("cameraPermission")).toBeFalsy();
});
});
并尝试
(在文件mocks/expo.js中)
并尝试
(在文件mocks/expo.js中)
错误:“TypeError:无法读取未定义的属性“askAsync”
此错误发生在调用权限.askAsyc
的行上。所以权限是未定义的。(还使用console.log(权限)
我原以为instance.state(“cameraPermission”)是错误的,但它在到达该行之前就崩溃了。问题是您处理异步测试的方式不正确(您的
checkPermission()
函数是异步的)。有几种方法可以告诉jest您想要测试异步函数
以下是您的问题的快速解决方案:
。。。
从“expo”导入{Permissions};
...
开玩笑的模仿('expo',()=>({
权限:{
askAsync:jest.fn(),
}
}));
...
描述(“测试权限功能”,()=>{
它('应返回被拒绝的权限',()=>{
Permissions.askAsync.mockImplementation(permission=>{return{status:'grated'};});//如果要添加某种自定义功能
常量包装器=浅();
const instance=wrapper.instance();
返回instance.checkPermission().then(数据=>{
expect(instance.state(“cameraPermission”).toBeFalsy();
});
});
});
自expo将包更改为“expo权限”中的“导入权限”;
您只需创建“mocks/expo permissions.js”并使其具有:
export const getAsync=jest.fn(权限=>Promise.resolve());
export const askAsync=jest.fn(权限=>Promise.resolve());
是正确的,是一个良好的开端。要添加更多详细信息:
根目录
,否则您应该将您的模拟文件放在\uuuuuuu mocks\uuuu/expo permissions.js
中,其中\uuuuuuu mocks\uuuuuu
是与您的节点模块
文件夹处于同一级别的目录。请参阅上的Jest文档permissions
参数将是未定义的,因此您需要模拟要使用的权限类型。只需要像export const CAMERA_ROLL='CAMERA_ROLL';这样简单的东西即可
权限。摄影机
但拒绝权限。摄影机滚动
和所有其他类型),您可以模拟askAsync
函数的实现。例如,您的\uuuuuu mocks\uuuu/expo permissions.js
文件如下所示:export const-CAMERA='CAMERA';
导出常量摄影机滚动='摄影机滚动';
export const askAsync=jest.fn().mockImplementation((permissionType)=>{
const responseData=permissionType==CAMERA?{status:'grated'}:{status:'underminated'};//您还可以传递'denied',而不是'underminated'`
返回承诺。解决(responseData);
});
jest.mock('expo', ()=>({
Permissions: {
askAsync: jest.fn()
}
}))
export default {
Permissions: {
askAsync: jest.fn(() => {
return "SOMETHING"
})
}
}
jest.mock('expo', ()=>({
Permissions: {
askAsync: jest.fn()
}
}));