Permissions Expo TypeError的Jest模拟权限:无法读取属性';askAsync';未定义的

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);

我正在模拟expo和权限模块,但调用Permissions.AskAsync Permissions时未定义

问题看起来像这个问题

使用提供的答案,但不起作用

我嘲笑了axios,它可以工作。对expo模块执行同样的操作不起作用

我要测试的功能:

    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()); 是正确的,是一个良好的开端。要添加更多详细信息:

  • 除非您为Jest配置了不同的
    根目录
    ,否则您应该将您的模拟文件放在
    \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()
        }
    }));