ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javascript-使react-router不会破坏Jest(reactJs)测试

2019-11-21 03:33:58  阅读:347  来源: 互联网

标签:reactjs react-router react-jsx jestjs javascript


我目前正在尝试将Jest测试添加到React应用程序(找到here).

但是,当我运行以下测试时,

/** @jsx React.DOM */

jest.dontMock('jquery');
jest.dontMock('../js/components/CategoryPage.jsx');
describe('Category Page', function() {
  var React = require('react/addons');
  var TestUtils = React.addons.TestUtils;
  var CategoryPage = require('../js/components/CategoryPage.jsx');
  it('renders into the page correctly', function() {
    // Render the CategoryPage into the document
    var categoryPage = TestUtils.renderIntoDocument(
      <CategoryPage params={{"category": "tests"}} />
    );
    expect(categoryPage).toBeDefined();
  });
});

我收到以下错误:

● Category Page › it renders into the page correctly
  - TypeError: Property 'makeHref' of object #<Object> is not a function
        at Navigation.makeHref (/home/stephen/reps/node_modules/react-            router/modules/mixins/Navigation.js:29:25)
        at React.createClass.getHref (/home/stephen/reps/node_modules/react-router/modules/components/Link.js:76:17)
        at React.createClass.render (/home/stephen/reps/node_modules/react-router/modules/components/Link.js:97:18)
        at ReactCompositeComponentMixin._renderValidatedComponent (/home/stephen/reps/node_modules/react/lib/ReactCompositeComponent.js:1260:34)
        at wrapper [as _renderValidatedComponent] (/home/stephen/reps/node_modules/react/lib/ReactPerf.js:50:21)
        at ReactCompositeComponentMixin.mountComponent     (/home/stephen/reps/node_modules/react/lib/ReactCompositeComponent.js:802:14)
        at wrapper [as mountComponent] (/home/stephen/reps/node_modules/react/lib/ReactPerf.js:50:21)
        at ReactDOMComponent.ReactMultiChild.Mixin.mountChildren (/home/stephen/reps/node_modules/react/lib/ReactMultiChild.js:195:42)
        at ReactDOMComponent.Mixin._createContentMarkup (/home/stephen/reps/node_modules/react/lib/ReactDOMComponent.js:260:32)
        at ReactDOMComponent.Mixin.mountComponent (/home/stephen/reps/node_modules/react/lib/ReactDOMComponent.js:182:14)
        at ReactDOMComponent.wrapper [as mountComponent] (/home/stephen/reps/node_modules/react/lib/ReactPerf.js:50:21)
        at ReactDOMComponent.ReactMultiChild.Mixin.mountChildren (/home/stephen/reps/node_modules/react/lib/ReactMultiChild.js:195:42)
        at ReactDOMComponent.Mixin._createContentMarkup (/home/stephen/reps/node_modules/react/lib/ReactDOMComponent.js:260:32)

我的应用程序和CategoryPage组件都专门使用react-router. CategoryPage包含一个使用反应路由器进行身份验证的混合.根据我自己的调试,我发现当Jest尝试调用makeHref(反应路由器的内置导航方法之一)时发生错误.

为了解决这个问题,我首先尝试调用jest.dontMock(‘react-router’),但这没有任何效果.问题似乎是,通过不嘲笑CategoryPage,笑话将自动且不可逆地包括其所有依赖项,且不受模拟.

这个问题很难解决的部分原因是,大多数将Jest与React一起使用的人似乎没有在测试其组件,或者是因为他们不注重测试,或者是因为他们使用的是Flux而仅测试Stores,Dispatchers等.我们尚未使用Flux,因此这不是我们的选择,但可能是将来我们必须过渡的事情.

编辑1:如果删除jest.dontMock(‘../ js / components / CategoryPage.jsx’),则测试通过,但是实际上无法测试该组件的功能.

编辑2:当我排除jest.dontMock(‘jquery’)时,我得到另一个与用于创建模态的mixin相关的错误:

Category Page › it encountered a declaration exception
- TypeError: 
/home/stephen/reps/js/components/CategoryPage.jsx:  
/home/stephen/reps/js/components/Feed.jsx:     
/home/stephen/reps/js/components/InvestmentButton.jsx: 
/home/stephen/reps/js/components/Modal.jsx: 
/home/stephen/reps/js/mixins/BootstrapModalMixin.jsx: 
/home/stephen/reps/node_modules/bootstrap/dist/js/npm.js: 
/home/stephen/reps/node_modules/bootstrap/js/alert.js: Cannot call method 'on' of undefined

编辑3:我似乎已经隔离了反应路由器的Navigation mixin的错误,它称为this.context.makeHref.从.9版本开始,React团队已弃用this.context,因此我认为这可能是问题的根源.因此,欢迎对此this.context进行任何变通或修复.

解决方法:

我继续整理了一个修复程序,使您仍然可以使用Jest.

https://labs.chie.do/jest-testing-with-react-router/

标签:reactjs,react-router,react-jsx,jestjs,javascript
来源: https://codeday.me/bug/20191121/2048904.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有