1

我正在测试一个 React 应用程序,它基本上遵循了标准的、官方祝福的create-react-app设置。

我写了我的测试如下:

import React from 'react';
import {shallow} from 'enzyme';

import MyComponent from './MyComponent';

describe('MyComponent', () => {
    it('should have the expected properties', () => {
        const wrapper = shallow(<MyComponent/>);
        expect(wrapper.props()).toMatchObject({a: 1});
    });
});

我的 package.json 包含以下内容:

{
  ...
  "devDependencies": {
    "enzyme": "^2.6.0",
    "react-scripts": "0.8.3",
    ...
  },
  "dependencies": {
    "react": "^15.4.1",
    ...
  },
  "scripts": {
    "test": "react-scripts test --env=jsdom",
    ...
  },
  "jest": {
    "automock": false
  }
}

当我运行测试时,我收到以下错误消息:TypeError: expect(...).toMatchObject is not a function.

但是,react-scripts 文档指出 Jest 是使用的内置工具之一,例如我不必这样做npm installJest 文档清楚地表明这是toMatchObject 一个函数。

那么为什么我会收到此错误消息?

4

1 回答 1

2

tl; dr:运行npm install jest以获取最新的 (v18+) 笑话。

2016 年 12 月上旬的原始答案:

我发现这是 Jest 本身的问题。它记录在这里。如果我没看错的话,这与其说是一个错误,不如说是一个在实际准备好公开发布之前就进入文档的功能。显然,它现在应该随时会出来。同时,有人(Jest 团队?其他人?)提供了一个助手,可以在这里找到这个助手来填写这个匹配器,直到它正式可用。我实际上没有尝试过这个助手,我怀疑它可能很快就会消失,但我想如果他们真的想要这个功能,我会让任何感兴趣的读者知道它。

2017 年 1 月上旬更新:

根据这个网站toMatchObject匹配器于 2017 年 1 月 3 日左右被包含在 Jest 中。那是 Jest v18(18.0.0?......目前是 18.1.0)。node_modules这仍然没有包含在基本的 React 下载中,因为当我删除我的文件夹并重新npm install编辑所有内容时,这个匹配器仍然对我不起作用。但是,如果我专门更新了 jest,npm install jestnode_modules/jest/package.json表示 jest 现在已更新(对我而言,2017 年 1 月 15 日更新到版本 18.1.0)并且toMatchObject现在似乎可以工作。

...实际上,上一段中的解决方案似乎变化无常,因为它在我最初使用它时确实有效,但在那之后不久又停止工作(在再次重新删除node_modulesnpm install重做所有内容、重新做npm install jest,甚至从评论中尝试@Scimonster 的建议,即删除node_modules/react-scripts/node_modules/jest)。我确实找到了另一个有效的技巧:从这里手动添加实际toMatchObject代码(在恢复一些 ES6/typescript/babel?-ish 语法之后)。我认为这一切都将在未来不太远的 React 更新中得到修复,但现在这对我有用(至少目前如此!)。node_modules/react-scripts/node_modules/jest-matchers/build/matchers.js

于 2016-12-11T15:08:40.250 回答