Получение ReferenceError: выборка не определена

63
5

В своем тесте Saga для моего собственного родного приложения (которое работает правильно) я добавил следующий тест, который вызывает функцию, выполняющую HTTP-вызов POST (doScan).

describe('Scan the product and register the scanning action', () => {
const it = sagaHelper(scanProductSaga(scanProductAction(item)));

it('logscan via ASL', (result) => {
expect(result).toEqual(cps(ASLogger.logScan, xxx));
return logScanResult;
});

it('should register the product', (result) => {
expect(result).toEqual(call(doScan, logScanResult));
});
});

Отдельный файл:

const doScan = scanObj =>
toJSON(fetch('https://xxxx.xxxxxx.com/logger/scans', {
method: 'POST',
headers: new Headers(CONTENT_TYPE_HEADERS),
body: JSON.stringify(scanObj),
}));

Примечание: функция выборки находится из "react-native-interfaces.js" внутри библиотеки, соответствующей реакции. Тест завершился неудачно, и ошибка вызвана следующим исключением:

ReferenceError: fetch is not defined
at doScan (/Users/andy/WebstormProjects/ASAP/api/index.js:81:11)....

Что может вызвать такую проблему? Какое решение может быть?

спросил(а) 2021-01-25T10:56:36+03:00 4 месяца, 4 недели назад
1
Решение
63

response-native имеет fetch умолчанию, но тестовая среда на node.js не имеет fetch.

Вы можете импортировать fetch как fetch в тестовом коде.

const fetch = require('node-fetch')

Файл response-native-interface.js объявляет только тип fetch.

declare var fetch: any;

ответил(а) 2021-01-25T10:56:36+03:00 4 месяца, 4 недели назад
45

В некоторых случаях в универсальном приложении как для клиента, так и для сервера, разработчики должны использовать модуль isomorphic-fetch для своего проекта Node поскольку Node еще не содержит Fetch API. Для получения дополнительной информации прочтите этот вопрос и ответ

Но в этом специальном случае, следовательно, React Native, он несколько отличается, потому что в области мобильных устройств нет V8, SpiderMonkey или Node. Есть JavaScriptCore. Итак, для этой новой ситуации следует использовать react-native-fetch.

Это немного отличается, установите его с помощью кода ниже:

npm install react-native-fetch

И затем используйте его как компонент JSX:

import Fetch from 'react-native-fetch'
...
<Fetch
url="https://jsonplaceholder.typicode.com/posts/1"
retries={3}
timeout={3000}
onResponse={async (res) => {
const json = await res.json()
console.log(json)
}}
onError={console.error}
/>

Это так ново, но прекрасно.

ответил(а) 2021-01-25T10:56:36+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема