Jest Mocking Permissions Expo TypeError: Невозможно прочитать свойство 'askAsync' из неопределенного - PullRequest
1 голос
/ 04 июня 2019

Я издеваюсь над выставкой и модулем Permissions, но при вызове Permissions.AskAsync Permissions не определено.

Проблема выглядит следующим образом. Использование Jest для имитации именованного импорта

Использовал предоставленный ответ, но не работал.

Я издевался над аксио, который работает. Делать то же самое для модуля экспо не работает.

Функция, которую я хочу проверить:

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

Макет, который я использую для выставки:

jest.mock('expo', ()=>({
  Permissions: {
     askAsync: jest.fn()
  }
}))

и попробовал (В файле издевается / expo.js)

export default {
    Permissions: {
        askAsync: jest.fn(() => {
            return "SOMETHING"
        })

    }
}

и попробовал (В файле издевается / expo.js)

jest.mock('expo', ()=>({
    Permissions: {
        askAsync: jest.fn()
    }
}));

Ошибка: «Ошибка типа: невозможно прочитать свойство 'askAsync' из неопределенного"

Эта ошибка возникает в строке, где вызывается Permissions.askAsyc. Таким образом, разрешения не определены. (Также проверил это с console.log(Permissions)

Я ожидал, что instance.state("cameraPermission") будет ложным, но он падает до того, как достигнет этой линии.

1 Ответ

0 голосов
/ 05 июня 2019

Проблема в том, что вы неправильно обрабатываете асинхронные тесты (ваша функция checkPermission() является асинхронной).Есть несколько способов сообщить jest, что вы хотите протестировать асинхронную функцию. Вот несколько способов.

Вот быстрое решение вашей проблемы:

...

import { Permissions } from 'expo';

...

jest.mock('expo', () => ({
    Permissions: {
        askAsync: jest.fn(),
    }
}));

...

describe("Test the Permission function", () => {
    it('should return rejected permission.', () => {
        Permissions.askAsync.mockImplementation( permission => { return {status: 'granted'}; } ); // if you want to add some sort of custom functionality

        const wrapper = shallow(<Photo2/>);
        const instance = wrapper.instance();

        return instance.checkPermission().then(data => {
            expect(instance.state("cameraPermission")).toBeFalsy();
        });
    });
});
...