RN + Redux + Jest - Невозможно проверить асинхронную функцию, поскольку файл импортирует Store - PullRequest
1 голос
/ 19 июня 2019

Я занимаюсь разработкой приложения, в котором есть две функции: fetchAnonymous и fetchAuthenticated, которые проверяют, вошел ли пользователь в систему или нет. Если он не вошел в систему, отправляет действие для выхода пользователя из системы для перенаправления на экран входа в систему. Проблема в том, что когда я импортирую хранилище в этом файле, чтобы использовать метод отправки, мои тесты выдают ошибки. Как я могу высмеять это, чтобы тесты могли пройти?

апи / base.js

import appStore from 'store';
import { getToken } from 'api/session';

export async function fetchAuthenticated(path, config) {
  const currentToken = await getToken();
  if (!currentToken) {
    appStore.dispatch({type: "SESSION_LOGOUT"});
    return { error: new APIError(path, {status: 401}, "missing token") };
  }

  let headers = config.headers || {};
  headers = {
    ...headers,
    Authorization: "Bearer " + currentToken
  }

  return await fetchAnonymous(path, {
    ...config,
    headers
  });
}

export async function fetchAnonymous(path, config){
  let response;
  let url = `${API_ENDPOINT}/${path}`;
  try {
    response = await fetch(`${API_ENDPOINT}/${path}`, {
      headers: {
        Accept: "application/json",
        "Content-Type": "application/json"
      },
      ...config
    });
  } catch (err) {
    return { error: new NetworkError(err.message) };
  }


  if(response.status == 401 || response.status == 403){
    appStore.dispatch({type: "SESSION_LOGOUT"});
    return { error: new APIError(path, response, 'Missing Authentication')}
  }

  if(response.status != 200 && response.status != 201 && response.status != 204){
    try {
      const json = await response.json();
      return { error: new APIError(path, response, json.error) };
    } catch (err) {
      return { error: new APIError(path, response, err.message) };
    }

  }

  try {
    const json = await response.json();
    return { response: json };
  } catch (err) {
    return { error: new APIError(path, response, err.message) };
  }


}

export class NetworkError extends Error {
  constructor(message) {
    super(message);
    this.name = "NetworkError";
    this.message = message;
  }
}

export class APIError extends Error {
  constructor(path, response, message = "Try again :(") {
    super(`Unexpected response from ${path}, received ${response.status}: ${message}`);
    this.message = message;
    this.name = "APIError";
    this.status = response.status;
  }
}

магазин / index.js

import { createStore, applyMiddleware } from 'redux';
import createSagaMiddleware from "redux-saga";
import { createLogger } from 'redux-logger';
import sagas from 'sagas';
import reducers from 'reducers';
import {
  createReactNavigationReduxMiddleware
} from 'react-navigation-redux-helpers';

const sagaMiddleware = createSagaMiddleware();
const loggerMiddleware = createLogger({collapsed: true});
const navigationMiddleware = createReactNavigationReduxMiddleware(
  state => state.nav,
);
const middlewares = [
  sagaMiddleware,
  navigationMiddleware
]
if (process.env.NODE_ENV === `development`) {
  middlewares.push(loggerMiddleware);
}

const store = createStore(
  reducers,
  applyMiddleware(...middlewares)
);

sagaMiddleware.run(sagas);

export default store;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...