Reactjs react路由器v4链路不';不要在karma test runner中工作

Reactjs react路由器v4链路不';不要在karma test runner中工作,reactjs,react-router,Reactjs,React Router,我想写一些规范来测试我的应用程序中的当前路由。我使用karma运行我的Spec和mocha作为测试框架。在我点击一些组件之前,一切都正常。事件onclick已启动,但不会触发重新呈现我的组件,因此不会发生任何更改(应用程序不会呈现新的路由器)。我当前的代码: <!-- language: lang-js --> 'use strict'; import React from 'react'; import { BrowserRouter, Match, Redirect } from

我想写一些规范来测试我的应用程序中的当前路由。我使用karma运行我的Spec和mocha作为测试框架。在我点击一些
组件之前,一切都正常。事件onclick已启动,但不会触发重新呈现我的组件,因此不会发生任何更改(应用程序不会呈现新的
路由器)。我当前的代码:

<!-- language: lang-js -->
'use strict';
import React from 'react';
import { BrowserRouter, Match, Redirect } from 'react-router';
import { shallow, mount } from 'enzyme';
import sinon from 'sinon';
import chai, { expect } from 'chai';
import axios from 'axios';
import Main_Store from '../../main.store';
import Base from '../../components/base.component';

describe.only('--Routing--', () => {
   let main_store, wrap;
   beforeEach(() => {
      main_store = new Main_Store();
      wrap = mount(
         <MemoryRouter initialIndex={1} initialEntries={['/', '/kit']}>
            <Match pattern={'/:district'} render={(props) => {
                  console.log('trigger match');
                  return <Base {...props} main_store={main_store} />
               }
            } />
         </MemoryRouter>
      );
   });

   describe('click on link', () => {
      beforeEach(() => {
         wrap.find('Link').findWhere(n => n.prop('to') === '/kit/user-1/type-created').simulate('click');
      });

      it('render Profile Bar', () => {
         console.log('current html', wrap.html())
         expect(wrap.find('.personSidebar')).to.have.length(1);
      });
   });
});

"严格使用",;
从“React”导入React;
从“react router”导入{BrowserRouter,Match,Redirect};
从“酶”导入{shall,mount};
从“sinon”进口sinon;
从“chai”导入chai,{expect};
从“axios”导入axios;
从“../../Main.Store”导入主存储;
从“../../components/Base.component”导入Base;
仅说明('--路由--',()=>{
让主_储存、包装;
在每个之前(()=>{
main_store=新的main_store();
包裹=安装(
{
log(“触发器匹配”);
返回
}
} />
);
});
描述('点击链接',()=>{
在每个之前(()=>{
wrap.find('Link').findWhere(n=>n.prop('to')=='/kit/user-1/type created').simulate('click');
});
它('渲染配置文件栏',()=>{
console.log('current html',wrap.html())
expect(wrap.find('.personSidebar')).to.have.length(1);
});
});
});
当前事件日志

  • 装载后,组件将识别它是否与当前路径名匹配
  • 组件是第一次渲染的
  • 启动上的onClick事件
  • 没有别的了。在我的浏览器中,我再次得到1分和2分,这意味着在单击链接后将重新渲染组件树。但是在我的测试库存中,在3-d点之后什么也没有发生。

    组件需要一个左键单击事件(
    event.button=0
    )。酶传递的默认事件不包括此项。您可以将事件对象添加到
    simulate
    调用中,以正确配置模拟事件

    wrap.find('Link')
      .findWhere(n => n.prop('to') === '/kit/user-1/type-created')
      .simulate('click', {
        defaultPrevented: false,
        preventDefault() { this.defaultPrevented = true },
        metaKey: null,
        altKey: null,
        ctrlKey: null,
        shiftKey: null,
        button: 0
      });
    

    首先,您能否在
    节点\u模块中找到这行代码()
    ,并将其记录在回调中的
    this.history.location
    (在
    this.forceUpdate()之前)
    ?如果它记录了您模拟点击的路径,那么应该验证点击是否传递到
    历史记录中。它在测试时不记录任何内容,但在浏览器中记录下一个对象{pathname:“/kit/base/type popular concepts”,搜索:“,散列:”,查询:null,键:“z33ga5”}好的,所以问题似乎是模拟的点击不起作用。您是否可以在链接组件的转换处理程序()中将
    登录到
    ,以验证单击是否确实被发送到您的
    历史记录
    实例。当我登录到时,我没有得到任何信息。我还在handleClick方法中添加了几个console.log:每个if语句前加一个,每个if语句内加一个;只有第一个控制台日志(在第一个if语句之前)被触发。您的
    是否附加了
    onClick
    事件?谢谢!你帮了我很多问题。我很高兴)