4

我有一个与store通信的React 视图。我已经成功地分别测试了视图和商店,但没有组合在一起。

我遵循了此处记录的结构,但收到了TypeError。看起来 Jest 正在尝试将商店注册为组件,即使我使用dontMock.

Using Jest CLI v0.2.0
 PASS  __tests__/unit/spec/stores/ViewStore-spec.js (0.248s)
 FAIL  __tests__/unit/spec/components/View-spec.react.js (0.942s)
undefined
● View › it defaults to zero unread
  - TypeError: /Users/matnorri/dev/projects/matnorri/web-client/src/app/scripts/components/View.react.js: /Users/matnorri/dev/projects/matnorri/web-client/src/app/scripts/stores/ViewStore.js: Cannot call method 'register' of undefined
        at /Users/matnorri/dev/projects/matnorri/web-client/src/app/scripts/stores/ViewStore.js:43:31
        at Object.runContentWithLocalBindings (/Users/matnorri/dev/projects/matnorri/web-client/node_modules/jest-cli/src/lib/utils.js:357:17)
        ...

我已经包含了我认为是下面的相关代码,但如有必要,可以完整提供。

查看笑话测试

jest.dontMock('../../../../src/app/scripts/components/View.react');
jest.dontMock('../../../../src/app/scripts/stores/ViewStore');

describe('View', function() {

  var React;
  var TestUtils;
  var ViewComponent;
  var View;

  beforeEach(function() {
    React = require('react/addons');
    TestUtils = React.addons.TestUtils;
    ViewComponent =
      // Tried both lines with same effect.
      // require('../../../../src/app/scripts/components/View.react.js');
      require('../../../../src/app/scripts/components/View.react');
    View = TestUtils.renderIntoDocument(<ViewComponent />);
  });

  it('defaults to zero unread', function() {
    View._toString = jest.genMockFunction();
    View._onChange();
    expect(View.state.unread).toBe(0);
  });
});

谢谢!

4

1 回答 1

4

回答你的问题

我也遇到了这个问题,没有嘲笑 object-assign 为我解决了这个问题。添加jest.dontMock('object-assign');到您的规范文件。这将解决问题。

// View Jest test
jest.dontMock('../../../../src/app/scripts/components/View.react');
jest.dontMock('../../../../src/app/scripts/stores/ViewStore');

嘲笑或不嘲笑

有关何时“模拟或不模拟”的更多信息可以在Jest 文档网站上找到。

Jest 修改了“require”方法的默认行为并实现了它自己的 require 方法。这样他们就可以模拟文件中的每个函数。因此,如果您希望某些东西真正起作用(例如在商店中),则不应模拟该文件。

在您的情况下,您不是在模拟 ViewStore,因此将调用该 Store 上的每个函数。因为您没有模拟object-assign对象分配功能不起作用。这种方式 ViewStore 没有以正确的方式创建(它返回undefined)并且测试抛出错误Cannot call method 'register' of undefined,因为您的assign函数不起作用,因为它被模拟了。

再次; 如果您通读 Jest 网站上的文档,您会发现有关何时“模拟或不模拟”的详细说明。


额外信息

unmockedModulePathPatterns我建议在您的测试配置中添加“object-assign”和其他常用模块(如 lodash/underscore) 。有关此的更多信息:https ://facebook.github.io/jest/docs/api.html#config-unmockedmodulepathpatterns-array-string

于 2014-12-11T21:25:32.353 回答