javascript - 使用 Jest 进行测试时,是否有更快的方法来重置模拟?

标签 javascript unit-testing reactjs reactjs-flux jestjs

我正在编写一些 React/Flux 代码并使用 Jest 对其进行测试。到目前为止一切都很好,除了我的测试已经需要很长时间才能完成。

罪魁祸首似乎是在每次测试之间重置模拟。

我的一般设置如下所示:

jest.dontMock('react');
jest.dontMock('../Widget.jsx');

describe('Widget', function() {
  var React, TestUtils, Widget, WidgetStore;

  beforeEach(function() {
    React = require('react/addons');
    TestUtils = React.addons.TestUtils;
    WidgetStore = require('../WidgetStore');
    Widget = require('../Widget');
  });

  it('should fetch initial state from the store', function() {
    WidgetStore.getDoobles.mockReturnValueOnce({});

    var widget = TestUtils.renderIntoDocutment(
      <Widget />
    );

    expect(WidgetStore.getDoobles.mock.calls.length).toBe(1);
  });

  it('should refresh its data when clicked', function() {
    WidgetStore.getDoobles.mockReturnValueOnce({});

    var widget = TestUtils.renderIntoDocutment(
      <Widget />
    );

    WidgetStore.getDoobles.mockReturnValueOnce({'foo': 'bar'});        

    TestUtils.Simulate.click(widget);

    expect(WidgetStore.getDoobles.mock.calls.length).toBe(2);
  });
});

在我的示例中,如果我在两次测试之间不重新加载商店,我将得到错误的 getDoobles 调用次数结果,这是有道理的,因为它是同一个对象.

但是重新加载模拟需要一些时间,如果我做了很多测试,那么它们最终会变慢。

我只想克隆对象或调用重置函数。单个函数 (mockClear()) 有一个重置函数,但似乎没有针对整个对象的全局重置。而且我无法克隆该对象,因为克隆的对象与我的 React 组件正在访问的对象不同,因此不会注册任何调用。

这带来了另一个问题。看来我需要重新加载依赖链中的所有内容。如果我只是重新要求 WidgetStore,那么我有权访问的对象似乎与 Widget 有权访问的对象不同。

如果我只是重新加载 WidgetStoreWidget 那么我经常会遇到错误,这似乎是由 having two copies of React loaded 引起的.所以我每次都不得不重新加载 React。

那么有更好的方法吗?

最佳答案

我们在 describe() 之前设置 React 和 TestUtils 变量并且不使用 jest.dontMock('react')。还需要 Widget 和 WidgetStore 可能在那里。在你的情况下是这样的:

jest.dontMock('../Widget.jsx');

var React = require('react/addons');
var TestUtils = React.addons.TestUtils;
var WidgetStore = require('../WidgetStore');
var Widget = require('../Widget');

describe('Widget', function() {
  var widget;

  beforeEach(function() {
    widget = TestUtils.renderIntoDocument(
      <Widget />
    );
    WidgetStore.getDoobles.mockClear();
  });

  it('should fetch initial state from the store', function() {
    WidgetStore.getDoobles.mockReturnValueOnce({});

    expect(WidgetStore.getDoobles.mock.calls.length).toBe(1);
  });

  it('should refresh its data when clicked', function() {
    WidgetStore.getDoobles.mockReturnValueOnce({});
    WidgetStore.getDoobles.mockReturnValueOnce({'foo': 'bar'});        

    TestUtils.Simulate.click(widget);

    expect(WidgetStore.getDoobles.mock.calls.length).toBe(2);
  });
});

关于javascript - 使用 Jest 进行测试时,是否有更快的方法来重置模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28387152/

相关文章:

c# - 使用 MOQ 设置和返回的正确方法

html - 自定义单选按钮边框颜色

javascript - 从 CDN 与本地请求 javascript 时的 header 不同

php - 如何使用 PHPUnit 测试 mail()

javascript - JSFL for...in 循环似乎不起作用

python - assertEqual - 两个相同的列表,为什么我得到奇怪的结果?

javascript - 如何使用react router dom显示详细信息页面

reactjs - React 与 Puppeteer + Istanbul 的代码覆盖率

javascript - Azure:将前端 (React) 连接/代理到后端 (Express/node.js)

javascript - 单元测试失败的 promise