Имитация данных локального хранилища в тесте

#reactjs #mocking #local-storage #jestjs

#reactjs #насмешливый #локальное хранилище #jestjs

Вопрос:

Я использую приложение Create React. Я пытаюсь смоделировать isLoggedIn поведение в моем компоненте, чтобы получить покрытие кода всех строк. Для этого ключ localStorage: user должен существовать с data.accessToken

Я попытался установить данные localStorage в тесте, но это не работает. тот же метод фактически работает в isLoggedIn функции и генерирует 100% покрытие линии.

Функция isLoggedIn

 export const isLoggedIn = () => {
  const userFromLocalStorage = store('user');
  return _get(userFromLocalStorage, 'data.accessToken', false);
};
 

PrivateRoute.js:

 const PrivateRoute = ({ component: Component, ...rest }) => (
  <Route
    {...rest}
    render={props =>
      isLoggedIn() ? (
        <Component {...props} />
      ) : (
        <Redirect to={{ pathname: 'login' }} />
      )
    }
  />
);
 

PrivateRoute.spec.js

 import store from 'store2';
describe('PrivateRoute Logged In', () => {
  store('user', {
    data: {
      accessToken: 'dfg',
    },
  });

  const ShallowPrivateRoute = shallow(
    <PrivateRoute path="/" name="Home" component={TestComponent} />
  );

  it('should cover logged in case', () => {
    expect(ShallowPrivateRoute).toBeDefined();
  });
});
 

Есть ли способ, которым я могу имитировать isLoggedIn функцию, чтобы вернуть true только для одного теста??

Каков наилучший способ протестировать такое поведение?

Ответ №1:

Вы можете издеваться над всем файлом следующим образом:

 jest.mock("you-module", () =>({...methodsMock}));
 

или вы могли бы получить isLoggedIn в props, таким образом, вам нужно только передать фиктивную функцию при рендеринге вашего компонента в test.

 <Component isLoggedIn={jest.fn().mockReturnValue(true)} />
 

Комментарии:

1. что вы имеете в виду под моим модулем?? если я импортирую import { isLoggedIn } from '../../helpers'; , так ли это jest.mock('../../helpers', () => ({ isLoggedIn: () => true })); ?? потому что это так не работает