为什么我的`react-scripts`测试不能识别Jest函数`toMatchObject`?

时间:2016-12-11 04:20:30

标签: javascript reactjs jestjs enzyme react-scripts

我正在测试一个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 documentation表示Jest是使用的内置工具之一,例如:我没有npm install它。 Jest documentation清楚地表明toMatchObject 是一个函数。

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

1 个答案:

答案 0 :(得分:2)

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

2016年12月初的原始答案:

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

2017年1月初更新:

根据this websitetoMatchObject匹配器于2017年1月3日左右被包含在Jest中。那是Jest v18(18.0.0?...目前为18.1.0)。这仍然没有包含在基本的React下载中,因为当我删除node_modules文件夹并重新npm install - 所有内容时,此匹配器仍无法正常工作。但是,如果我使用npm install jest专门更新了jest,那么node_modules/jest/package.json表示现在更新了jest(2017年1月15日更新为版本18.1.0),toMatchObject现在似乎工作

......实际上,上段中的解决方案似乎变幻无常,因为在我最初使用它时已经工作,但之后不久又停止了工作(之后再次重新删除{{ 1}},重新node_modules一切,重新做npm install,甚至从评论中尝试@ Scimonster的建议,即删除npm install jest)。我找到了另一个工作黑客:手动将here的实际node_modules/react-scripts/node_modules/jest代码添加到toMatchObject(在还原一些ES6 /打字稿/ babel?-ish语法之后)。我认为这一切都将在React的一个不太远的更新中修复,但是现在这对我有用(至少目前是这样!)。