“react + react-route”堆栈的单元测试

IT技术 javascript unit-testing testing tdd reactjs
2021-05-17 03:18:41

我已经阅读了许多关于如何通过 react-router 组件渲染路由的建议,但我仍然无法让它工作。我试图使用 github 代码库搜索找到它,但仍然没有运气。在这一点上,我需要的只是一个工作示例。

这是我的样板项目,但也许它并不重要。我只想看一些 react-route 单元测试工作示例。

2个回答

在我找到超级秘密隐藏的 react-router 测试指南后,我开始工作了

我没有使用 Object.assign 创建路由器存根,而是使用 sinon.js,这样我就可以创建更好的存根函数,为我的测试返回适当的值。

编辑:再次查看您的样板文件,发现您的存根路由器是从同一个示例中借用的。对不起。那么你到底卡在哪里呢?

再次编辑:我没有使用 Jest,所以这里是我解决测试难题所需的其他部分:

  1. 如果您使用的是 browserify,并想在纯 mocha 中进行测试(无需构建),则需要 hackrequire为您编译 jsx:
    var fs = require("fs");
    var reactTools = require("react-tools");

    require.extensions[".jsx"] = function(module, filename) {
      var jsxContent = fs.readFileSync(filename).toString();
      var jsContent = reactTools.transform(jsxContent);
      return module._compile(jsContent, filename);
    };
  1. 你需要一个假的 DOM。JSDOM 简直太糟糕了。我用它来domino代替。
    var domino = require("domino");

    global.window = domino.createWindow();
    global.document = global.window.document;

     //Set the NODE_ENV so we can call `render`.
     //Otherwise we get an error from react about server rendering. :(

    process.env.NODE_ENV = "test";
  1. 然后,您可以通过存根路由器要求您的组件,并使用以下命令将您的组件渲染到 DOM 节点中React.render()
      var MyComponent = fakeRouter(require("./MyComponent.jsx"));
      var component = React.render( 
        < MyComponent / > ,
        document.body
      );
      node = component.getDOMNode();
       //I used `zepto-node` and `chai-jq` to assert against my components

这样做的(v4 中可能是新的)方法是将您正在测试的组件包装在MemoryRouter由 react-router 提供的组件中

import {MemoryRouter} from 'react-router-dom';
import {render} from 'react-dom';

render(<MemoryRouter>
  <YourComponent>
</MemoryRouter>, node, () => {});