Как издеваться над локальным хранилищем-это правда с шуткой

#reactjs #logging #jestjs #mocking #local-storage

Вопрос:

У меня есть простой НабБар, который я хочу протестировать.

Если true , исходя из localStorage, будет отображаться кнопка.

src/components/UIElements/NavBar/NavBar.js

 const NavBar = () => {
 
  const isLoggedIn = localStorage.getItem('isLoggedIn');

  const handleLogout = () => {
    Auth.signOut().then(() => {
      localStorage.clear('isLoggedIn');
      history.push(routePath.LOGIN);
    });
  };

  return (
  
          {isLoggedIn amp;amp; (
            <Button onClick={handleLogout}>
              Logout
            </Button>
          )}
  );
 

В файле теста приведена часть моего теста:

Я не могу isLoggedIn = true использовать локальное хранилище для отображения кнопки, которую я хочу протестировать.

src/components/UIElements/NavBar/tests/NavBar.test.js

 
import { render, screen, fireEvent } from '@testing-library/react';
import { BrowserRouter as Router } from 'react-router-dom';
import Amplify, { Auth } from 'aws-amplify';
import awsConfig from '../../../../aws-exports';
import configureStore from 'redux-mock-store';

import NavBar from '../NavBar';


Amplify.configure(awsConfig);

describe('render <NavBar/> component', () => {

    beforeEach(() => {
        render(
            <Router>
                <NavBar />
            </Router>
        );
    });

    // jest mock user is login
    Auth.signUp = jest.fn().mockImplementation(
        () => {
            return true;
        });

    it('User can sign out', async () => {
        // jest mock user sign out
        const mockSignOut = jest.fn().mockResolvedValue({});
        Auth.signOut = mockSignOut;

        // jest mock isLoggedIn true - wont work 
        jest.mock('../NavBar')
        const isLoggedIn = require('../NavBar')
        isLoggedIn.mockImplementation(() => {
            return true;
        })
        
        const buttonLogout = await screen.getByRole('button', { name: /logout/i });
        fireEvent.click(buttonLogout)
        expect(mockSignOut).toHaveBeenCalled()
    });
});
 

Вот несколько примеров того, как я пытался найти решение.

#1

         jest.doMock('../NavBar', () => ({
        localStorage$: of({ isLoggedIn: true }),
        }))
 

#2

         const isLoggedIn = jest.fn()
        isLoggedIn.mockReturnValue(true)
 

#3

     let mockIsLoggedIn = false
    jest.mock('../NavBar', () => {
        return jest.fn(() => ({
            isLoggedIn: mockIsLoggedIn
        }))
    })

mockIsLoggedIn = true
 
 ● render <NavBar/> component › User can sign out

    TestingLibraryElementError: Unable to find an accessible element with the role "button" and name `/logout/i`
 

Любые исправления в коде были бы чрезвычайно полезны, спасибо!

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

1. Вы просто localStorage.setItem('isLoggedIn', true) в своей тестовой настройке, не нужно издеваться. Вы хотите проверить поведение с помощью этой настройки true и false .