单元测试反应动作 - browserHistory 未定义

Posted

技术标签:

【中文标题】单元测试反应动作 - browserHistory 未定义【英文标题】:Unit testing react actions - browserHistory is undefined 【发布时间】:2016-10-16 08:28:47 【问题描述】:

我为我的行为编写测试,使用

 browserHistory  from 'react-router';

当我运行测试时,导入的 browserHistory 因未知原因未定义。因此,测试抛出一个错误——“无法读取未定义的属性‘push’”; 我不知道,为什么 browserHistory 未定义,如果它在我的应用程序中有效。有人可以帮帮我吗?

【问题讨论】:

【参考方案1】:

我猜你没有使用 karma 或任何浏览器来运行你的测试。如果没有浏览器,对象 browserHistory 将是未定义的。您可能需要使用 sinon 来存根您的 browserHistory。以下内容可能会有所帮助:

import chai from 'chai';
import sinonChai from 'sinon-chai';
import componentToTest from './component-to-test'
import sinon from 'sinon';
import * as router from 'react-router';

var expect = chai.expect;
chai.use(sinonChai);

describe('Test A Component', () => 

    it('Should success.', () => 
        router.browserHistory =  push: ()=> ;
        let browserHistoryPushStub = sinon.stub(router.browserHistory, 'push', () =>  );
        //mount your component and do your thing here
        expect(browserHistoryPushStub).to.have.been.calledOnce;

        browserHistoryPushStub.restore();
    );

);

【讨论】:

我在这个答案中的关键是导入整个router 而不仅仅是browserHistoryhashHistory,这就是我试图模拟它的方式。【参考方案2】:

使用手表(npm run test -- --watch)时,我不得不保存并恢复原来的router.browserHistory以避免Invariant Violation(下)。

import * as router from 'react-router'

describe('some description', () => 
  const oldBrowserHistory = router.browserHistory
  after(() =>  router.browserHistory = oldBrowserHistory )

  it('some expectation', () => 
    const spy = sinon.spy()
    router.browserHistory =  push: spy 

    // call your code here

    expect(spy.withArgs(expectedArgs).calledOnce).to.be.true
  )
)

Invariant Violation:您提供了一个使用历史 v2.x 或更早版本创建的历史对象。这个版本的 React Router 只兼容 v3 历史对象。请升级到历史 v3.x。

(感谢 user3682091 让我开始走上正确的道路)

【讨论】:

以上是关于单元测试反应动作 - browserHistory 未定义的主要内容,如果未能解决你的问题,请参考以下文章

react-router v4 - browserHistory 未定义

如何在 VueJS 中对 Vuex 动作进行单元测试

在本机反应中单元测试触摸事件

使用玩笑的反应单元测试失败

react-router browserHistory 在 Apache 服务器上不起作用

用 Jest 反应单元测试 - 模拟 localStorage 的问题