javascript - 如何在单元测试环境中模拟 browserHistory?

标签 javascript unit-testing reactjs mocha.js react-router

我正在尝试测试使用 react-router 的 browserHistory 的 React 组件。为了确保能够访问 browserHistory,我使用了 createMemoryHistory (react-router) 模块,如下所示:

let createMemoryHistory = require('react-router/lib/createMemoryHistory');

在测试环境中,我利用了 JSDOM 库。

global.document = jsdom('');
global.window = document.defaultView;

然后我尝试将创建的历史对象分配给 DOM:

let history = createMemoryHistory();
global.history = history;

在测试环境中渲染组件时,出现以下错误:

Invariant Violation: Browser history needs a DOM

知道如何克服它吗?

最佳答案

您需要模拟 browserHistory 对象。您可以使用 sinon 创建 spy 或 stub 来帮助您对此进行测试。

例如:

使用 spy

const { createBrowserHistory } =  require('history');

const history = createBrowserHistory(/* ... */);

sinon.spy(history, "push");

// now you should be able to run assertions on history.push

assert(history.push.calledOnce)

关于 spystub 的更多信息

http://sinonjs.org/releases/v4.1.6/spies/

http://sinonjs.org/releases/v4.1.6/stubs/

关于javascript - 如何在单元测试环境中模拟 browserHistory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38976078/

相关文章:

javascript - 按键对对象数组进行分组

javascript - 无论如何要在未捕获的异常时进入 `debugger` 模式?

c# - 使用 AutoFixture 创建递归树

javascript - 如何在 useEffect 中使用 useState,访问组件挂载时更新的 useState 值?

javascript - AJAX - 如何在弹出菜单中运行脚本

javascript - 进入react js时调用api响应

ios - 执行整个测试套件时单元测试用例失败

c# - 如何使用 MediatR 进行测试

javascript - 如何使用 firebase 在值为真后退出 forEach 循环并使用react

Reactjs - 无法使下拉菜单正确格式化