简体   繁体   English

npm 测试:useNavigate() 只能在<router>成分</router>

[英]npm test: useNavigate() may be used only in the context of a <Router> component

I have a very simple test written, which only checks whether some text is displayed on screen.我写了一个非常简单的测试,它只检查屏幕上是否显示了一些文本。 But it gives an error saying useNavigate() may be used only in the context of a <Router> component.但是它给出了一个错误,说useNavigate() may be used only in the context of a <Router> component. , which is located in LoginButton.js . ,它位于LoginButton.js中。

useNavigate() may be used only in the context of a <Router> component.

  10 |     const service = new AccountService();
  11 |     const value = useContext(userContext);
> 12 |     const navigate = useNavigate();
     |                      ^
  13 |
  14 |     function handleLogin(user){
  15 |         value.userLogin(user);

index.js索引.js

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <BrowserRouter>
    <App />
  </BrowserRouter>
);

App.js应用程序.js

export default function App() {
  const service = new AccountService();
  const [stateUser, setStateUser] = useState(null);
  const navigate = useNavigate();
  let user;

  // some extra code...      
  
  return (
    <div className="App">
      <userContext.Provider value={value}>
        <Navbar/>
        <Routes>
          <Route path='/' element={<Posts/>}/>
          <Route path='/login' element={<Login/>}/>
          <Route path='/posts' element={<Posts/>}/>
        </Routes>
      </userContext.Provider>
    </div>
  );
}

Login.js登录.js

export default function Login() {
  const value = useContext(userContext);

  return (
    <>
      <div className='w-full h-[80vh] flex justify-center items-center'>
        <GoogleOAuthProvider clientId={process.env.REACT_APP_CLIENT_ID}>
          <LoginButton value={value}/>
        </GoogleOAuthProvider>
      </div>
      
    </> 
  )
}

LoginButton.js登录按钮.js

export const LoginButton = () => {
    const service = new AccountService();
    const value = useContext(userContext);
    const navigate = useNavigate();

    function handleLogin(user){
        value.userLogin(user);
        service.setUserSession(JSON.stringify(user));
        navigate('/posts');
    }

    const googleLogin = useGoogleLogin({
        onSuccess: async (tokenResponse) => {
            console.log(tokenResponse);
            const userInfo = await axios.get(
                "https://www.googleapis.com/oauth2/v3/userinfo",
                { headers: { Authorization: 'Bearer ' + tokenResponse.access_token } }
            );
            handleLogin(userInfo.data);
        },
        onError: (errorResponse) => console.log(errorResponse),
    });
  
    return <GoogleButton onClick={googleLogin}>Login</GoogleButton>;
};

The test:考试:

import { render, screen } from '@testing-library/react';
import App from './App';
import Login from './Pages/Login';

test('renders login in nav', () => {
  render(<Login />);
  const linkElement = screen.getByText(/Login/i);
  expect(linkElement).toBeInTheDocument();
});

in your test wrap the button component inside the Router component.在您的测试中,将按钮组件包装在路由器组件中。 something like the code below类似于下面的代码

import { Router } from 'react-router-dom';

 <Router initialEntries={['/']}>
        <button>
          Click
        </Button>
      </Router>
I had to wrap the component in a `BrowserRouter` inside the test.


import { render, screen } from '@testing-library/react';
import { BrowserRouter, Router } from 'react-router-dom';
import App from './App';
import Login from './Pages/Login';

test('renders login in nav', () => {
  render(<BrowserRouter><Login/></BrowserRouter>);
  const linkElement = screen.getByText(/Login/i);
  expect(linkElement).toBeInTheDocument();
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 错误:useNavigate() 只能在 a 的上下文中使用<router>成分</router> - Error: useNavigate() may be used only in the context of a <Router> component (反应路由器 v6)“错误:useNavigate() 只能在<router>特定组件中的组件”错误</router> - (react router v6) "Error: useNavigate() may be used only in the context of a <Router> component" error in hoc component 错误:useNavigate() 只能在 a 的上下文中使用<router>组件虽然我的登录页面的路由位于里面<browserrouter></browserrouter></router> - error: useNavigate() may be used only in the context of a <Router> component Although my login page's route is located inside <BrowserRouter> 我不断收到“useNavigate() 只能在<router> component" 运行时出错,我不确定为什么</router> - I keep getting "useNavigate() may be used only in the context of a <Router> component" error when running this and I'm not sure why React js:错误:useLocation()只能在a的上下文中使用<router>成分</router> - React js: Error: useLocation() may be used only in the context of a <Router> component 未捕获的错误:useLocation() 只能在 a 的上下文中使用<router>零件</router> - Uncaught Error: useLocation() may be used only in the context of a <Router> component 我如何解析“ useHref() 只能在上下文中使用<router>组件”当组件已经在里面时<router> ?</router></router> - How can I resolver " useHref() may be used only in the context of a <Router> component" when component is already inside <Router>? 反应路由器错误“useRoutes()只能用于<router>成分。”</router> - React router error "useRoutes() may be used only in the contect of a <Router> component." React Router Dom,使用 useNavigate 将数据传递给组件 - React Router Dom, pass data to a component with useNavigate 如何在 Class 组件中使用 useNavigate() React-Router-Dom Hook - How to use useNavigate( ) React-Router-Dom Hook in Class Component
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM