[英]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.