#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 }));
?? потому что это так не работает