You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Testing Library中userEvent.click触发navigate()警告问题

React Testing Library点击动态加载链接时的导航警告问题

我通过nock模拟后端请求拉取数据并存入数组,将每个数组项用<Link to="/test">链接包裹,点击链接需跳转至详情页。使用React Testing Library测试该功能时,已通过screen.debug(elem)确认后端数据正确获取且匹配元素存在,但调用userEvent.click(elem)时出现警告:

console.warn
You should call navigate() in a React.useEffect(), not when your component is first rendered.
// 完整错误栈见原输入

若组件使用静态数据而非动态后端数据,测试可正常运行。相关代码如下:

测试文件代码

test('renders learn react link', async () => {
    //nock mock requests for backend calls
    render(<App/>);
    let elem;
    await waitFor(() => {            
        elem = screen.getByText("Product Label 1").parentElement.parentElement;
        expect(elem).toBeInTheDocument;            
    });
    screen.debug(elem);
    await userEvent.click(elem);
    screen.debug();       
    await waitFor(async () => {
        let elem2 = await screen.findByText("Lorem Ipsum");
    });
});

数据获取组件(ProductsList)代码

const ProductsList = () => {
    const [productsList, setProductsList] = useState([]);
    const [noDataFound, setNoDataFound] = useState(false);
    const [isLoading, setIsLoading] = useState(true);
    const [searchData, setSearchData] = useState([]);
    const [searchParams, setSearchParams] = useSearchParams();
    const [mongoDB, setMongoDB] = useState(null);  
    const context = React.useContext(AppContext);
    const userContext = React.useContext(UserContext);   
    const app = context.app;
    const user = userContext.user;  
    useEffect(() => {
        const getDatabase = async () => {            
            let database = await user?.mongoClient("atlas");            
            setMongoDB( database );         
        }
        user && getDatabase();
    }, [user]);
    useEffect(() => {      
        const getProducts = async () => {
            console.log("calling realm");
            const col =  mongoDB.db("dbname").collection("collectionname");
            const products =  await col.aggregate(
                [
                    {"$skip" : 0 },
                    {"$limit": 12 }
                ]);
            if(!products || products.length === 0 ){
                setNoDataFound(true);
            }else{
                setNoDataFound(false);
            }
            setProductsList(products);
        }
        mongoDB && getProducts();
    }, [searchData, mongoDB, searchParams]);
    useEffect(() => {       
        if(productsList || productsList?.length === 0)
            setIsLoading(false);
    }, [productsList, setProductsList]);
    const getProducts = () => {
        return productsList.map( product => {           
            return (
                <Link to="/test" key={product['product-title']}>
                    <div className="product">                                       
                        <div className="product-title">{product['product-title']}</div>
                    </div>
                </Link>
            )
        });
    }
    return (
        <>              
            {                
                    <div className="products-container">    
                        <div className="products-list">
                            {productsList && productsList.length > 0 && getProducts()}
                        </div>
                    </div> 
            }            
        </>
    );
}

父组件(App)代码

function App() {
  return <BrowserRouter>
            <Routes>
                <Route exact path="/" element={<ProductsList />} /> 
                <Route exact path="/test" element={<ProductDetail />} />
            </Routes>
        </BrowserRouter>
}

详情页组件(ProductDetail)代码

const ProductDetail = () => {
    return <div>Lorem Ipsum</div>
}

内容的提问来源于stack exchange,提问作者A Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:20:53