【发布时间】:2021-07-14 23:04:49
【问题描述】:
我有一个带有受保护路由组件的 react 应用:
import React from 'react';
import { Route, Redirect } from 'react-router-dom';
import { AuthConsumer } from '../../Utils/contexts/AuthContext.js';
const ProtectedRoute = ({ component: Component, ...rest }) => {
return (
<AuthConsumer>
{({ currentUser }) => ( <Route {...rest} render={
props => {
if ({ currentUser }) {
return <Component {...rest} {...props} />
} else {
return <Redirect to={
{
pathname: '/unauthorized',
state: {
from: props.location
}
}
} />
}
}
} />)}
</AuthConsumer>
)
}
export default ProtectedRoute;
ProtectedRoute 使用授权上下文:
import React, { useEffect, useState } from 'react';
import firebase from '../firebase';
const AuthContext = React.createContext();
export const AuthProvider = ({ children }) => {
const [ currentUser, setCurrentUser ] = useState(null);
useEffect(() => {
firebase.auth().onAuthStateChanged((user) => setCurrentUser(user));
}, [currentUser]);
return (
<AuthContext.Provider
value={{
currentUser
}}
>
{children}
</AuthContext.Provider>
);
};
export const AuthConsumer = AuthContext.Consumer
我想通过 jest 和 react-testing-library 来测试当 currentUser 存在时路由是否有效,而当一个不存在时无效。到目前为止,我的测试是:
import React from 'react'
import Info from '../../pages/Info/info'
import {
render,
screen,
fireEvent,
} from '../../Utils/test-utils/testing-library-utils'
import ProtectedRoute from './protectedRoute'
jest.mock('../../pages/Info/info', () => {
return jest.fn(() => null)
})
const AuthContext = React.createContext()
const currentUser = {
uid: 1,
}
describe('protected route works with authenticated users', () => {
test('can login when user is authenticated', () => {
render(
<AuthContext.Provider
value={{
currentUser,
}}>
<ProtectedRoute component={<Info />} />
</AuthContext.Provider>
)
const returnedRoute = screen.queryByTestId('currentuser-valid')
console.log('RETURNED ROUTE', returnedRoute)
expect(returnedRoute).toBeNull()
})
})
我似乎无法将假的 currentUser 对象传递给 ProtectedRoute - 我总是得到“TypeError: Cannot destructure property currentUser of 'undefined' or 'null'。”
如何模拟 AuthContext?我该怎么做才能将它作为 currentUser 传递一个有效或无效的值,从而使测试通过或失败?
【问题讨论】:
-
我在变量范围方面遇到了类似的问题。这是一个很长的镜头,但是您可以尝试在
test方法中创建currentUser变量吗? -
这似乎没有什么不同 - 不知何故 currentUser 的值没有被使用?
标签: reactjs firebase-authentication jestjs mocking react-testing-library