我正在测试一个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
是一个函数。
那么为什么我会收到此错误消息?
答案 0 :(得分:2)
tl; dr:运行npm install jest
以获取最新的(v18 +)开玩笑。
2016年12月初的原始答案:
我发现这是Jest本身的一个问题。记录here。如果我正确地阅读它,那就不是一个错误,因为它是一个在工作中的功能,它在实际准备好公开发布之前已经进入了文档。显然,它现在应该在任何一天出来。与此同时,有人(Jest团队?其他人?)已经提供了一个帮助器,可以找到here来填充此匹配器,直到它正式可用。我实际上没有尝试过这个帮手,我怀疑它很快就会消失,但我想如果他们真的想要这个功能,我会让任何感兴趣的读者知道它。
2017年1月初更新:
根据this website,toMatchObject
匹配器于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的一个不太远的更新中修复,但是现在这对我有用(至少目前是这样!)。