首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用router以及Redux for react-testing-library进行渲染?

如何使用router以及Redux for react-testing-library进行渲染?
EN

Stack Overflow用户
提问于 2021-04-09 16:49:29
回答 1查看 84关注 0票数 1

这是我的testing-library-utils.js

代码语言:javascript
复制
import React from "react";
import { render as rtlRender } from "@testing-library/react";
import { Provider } from "react-redux";
import { createStore, applyMiddleware } from "redux";
import { composeWithDevTools } from "redux-devtools-extension";
import thunk from "redux-thunk";
import reducer from "../reducers/rootReducer";

import { createMemoryHistory } from "history";
import { Router } from "react-router-dom";

const middleware = [thunk];

const history = createMemoryHistory();

function render(
  ui,
  {
    initialState,
    store = createStore(
      reducer,
      initialState,
      composeWithDevTools(applyMiddleware(...middleware))
    ),
    ...renderOptions
  } = {}
) {
  function Wrapper({ children }) {
    return (
      <Provider store={store}>
        <Router history={history}>{children}</Router>
      </Provider>
    );
  }
  return rtlRender(ui, { wrapper: Wrapper, ...renderOptions });
}

// re-export everything
export * from "@testing-library/react";
// override render method
export { render };

当我单击某个<Link/>(使用userEvent)时,它不会导航到所需的页面。我想这就是我在testing-library-utils.js中使用<Router/>的方式。

我应该如何使用react-redux和react-router进行渲染,以便使用react- testing library进行测试?

EN

回答 1

Stack Overflow用户

发布于 2021-06-01 05:58:32

以下是如何在TypeScript中执行此操作:

代码语言:javascript
复制
import { MemoryRouter } from "react-router-dom";
import { render } from "@testing-library/react";
import { Provider } from "react-redux";
import { createStore, applyMiddleware } from "redux";
import thunk from "redux-thunk";
import reducer from "../reducers/rootReducer";

const middleware = [thunk];

export const renderWithRouterAndRedux = (
    component: React.ReactElement,
    { initialState = {}, store = createStore(reducer, initialState, applyMiddleware(...middleware)), route = "/", ...renderOptions } = {},
) => {
    window.history.pushState({}, "Initial Page", route);

    const Wrapper: React.FC = ({ children }) => (
        <Provider store={store}>
            <MemoryRouter>{children}</MemoryRouter>
        </Provider>
    );
    return render(component, { wrapper: Wrapper, ...renderOptions });
};


// re-export everything
export * from "@testing-library/react";
// override render method
export { render };
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67017951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档