Javascript 在使用Jest进行测试时,有没有更快的方法重置模拟?

Javascript 在使用Jest进行测试时,有没有更快的方法重置模拟?,javascript,unit-testing,reactjs,reactjs-flux,jestjs,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/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);
  });
});
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);
  });
});
jest.dontMock('react');
jest.dontMock('../Widget.jsx');
描述('Widget',function()){
var-React、TestUtils、Widget、WidgetStore;
beforeach(函数(){
React=要求('React/addons');
TestUtils=React.addons.TestUtils;
WidgetStore=require('../WidgetStore');
Widget=require('../Widget');
});
它('应该从存储中获取初始状态',函数(){
WidgetStore.getDoobles.mockReturnValueOnce({});
var widget=TestUtils.renderintoduction(
);
expect(WidgetStore.getDoobles.mock.calls.length).toBe(1);
});
它('单击时应刷新其数据',函数(){
WidgetStore.getDoobles.mockReturnValueOnce({});
var widget=TestUtils.renderintoduction(
);
WidgetStore.getDoobles.mockReturnValueOnce({'foo':'bar'});
TestUtils.Simulate.click(小部件);
expect(WidgetStore.getDoobles.mock.calls.length).toBe(2);
});
});
在我的示例中,如果我不在两个测试之间重新加载存储,我将得到对
getDoobles
调用次数的错误结果,这是有意义的,因为它将是同一个对象

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

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

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

如果我只是重新加载
WidgetStore
Widget
,那么我经常会收到错误,这些错误似乎是由以下原因引起的。所以我每次都得重新装填


那么有更好的方法吗?

我们在descripe()之前设置了React和TestUtils变量,并且没有使用jest.dontMock('React')。还需要Widget和WidgetStore。在您这样的情况下:

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);
  });
});
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);
  });
});
jest.dontMock('../Widget.jsx');
var React=require('React/addons');
var TestUtils=React.addons.TestUtils;
var WidgetStore=require('../WidgetStore');
var Widget=require('../Widget');
描述('Widget',function()){
var控件;
beforeach(函数(){
widget=TestUtils.renderIntoDocument(
);
WidgetStore.getDoobles.mockClear();
});
它('应该从存储中获取初始状态',函数(){
WidgetStore.getDoobles.mockReturnValueOnce({});
expect(WidgetStore.getDoobles.mock.calls.length).toBe(1);
});
它('单击时应刷新其数据',函数(){
WidgetStore.getDoobles.mockReturnValueOnce({});
WidgetStore.getDoobles.mockReturnValueOnce({'foo':'bar'});
TestUtils.Simulate.click(小部件);
expect(WidgetStore.getDoobles.mock.calls.length).toBe(2);
});
});

我不明白你怎么能不告诉Jest不要假装反应。似乎一切都会失败,因为所有的React函数都是mock。根据我的示例,您无法知道这一点,但在我的实际用例中,mockClear需要位于小部件呈现之上,因为我在getInitialState调用中调用存储。这意味着渲染也必须低于存储模拟。清除beforeach块中的mock是可行的,但我确实在寻找重置整个对象的方法。但是,也许我应该重新组织我的测试,使之更紧密,这样我只需要清除一些func。可能@minterior已经指定在package.json中不模拟React:
“jest”:{“scriptPreprocessor”:“/preprocessor.js”,“unmackedModulePathPathPatterns”:[“/node\u modules/React”],