我正在为我的React代码编写Jest测试,希望能使用/test PropType检查。我对Javascript领域还很陌生。我正在使用npm安装react-0.11.2
,并有一个简单的:
var React = require('react/addons');
在我的测试中,我的测试看起来非常类似于jest/react教程示例,代码如下:
var eventCell = TestUtils.renderIntoDocument(
<EventCell
slot={slot}
weekId={weekId}
day={day}
eventTypes={eventTypes}
/>
);
var time = TestUtils.findRenderedDOMComponentWithClass(eventCell, 'time');
expect(time.getDOMNode().textContent).toEqual('19:00 ');
然而,EventCell
组件中的PropType检查似乎没有被触发。我知道这些检查只在开发模式下运行,但我也认为通过npm获得react
给了您开发版本。当我用watchify构建组件时,这些检查在我的浏览器中触发。
我错过了什么?
8条答案
按热度按时间ua4mk5z41#
添加新的包jest-prop-type-error很简单,但在
PropType
错误时失败:安装方式:
然后将以下内容添加到
jest
部分中的package.json
的setupFiles
:qnzebej02#
由于ReactJS只会向控制台发送警告,而不会真正抛出错误,因此我用这种方法测试prop值:
3npbholx3#
对于基于Jest的单元测试,在您的
setup.js
上使用此代码将导致console.error
(prop类型错误)或console.warn
(React compat问题,如仍在使用componentWillUpdate
)最终被调用的任何测试失败:当任何测试调用
jest.restoreAllMocks()
时,这个问题就会中断--对我们来说,调用`` jest.clearAllMocks()'反而有帮助。它还要求您的应用不要调用
console.error
或console.warn
进行“错误处理”(请小心引用,因为这通常不是一个好主意)。vhmi4jdf4#
这就是我如何使用
Sinon
在React中测试PropType错误的。另外,要检查每个丢失原型的错误,请尝试console.log(sinon.assert.notCalled(console.error))
。xcitsw885#
使用React测试库https://reactjs.org/docs/testing-recipes.html
Dog.js
Dog.spec.js
pzfprimi6#
根本问题是How to test
console.log
?简短的回答是,您应该在测试期间替换
console.{method}
,常用的方法是使用spies,在这种特殊情况下,您可能希望使用stubs来防止输出。下面是一个使用Sinon.js的示例实现(Sinon.js提供独立的spies、stub和mock):
在此示例中,
DataName
组件在使用不表示精确日期(12:00:00 AM)的时间戳值进行初始化时将抛出错误。我正在存根
console.error
方法(这是Facebookwarning
模块内部用来生成错误的方法),我确保存根已经被调用过一次,并且只有一个参数代表错误。nhjlsmyf7#
@Gajus的回答确实帮了我的忙(所以,谢谢Gajus)。然而,我想我会提供一个答案:
就像Gajus在这里和其他人在其他地方建议的方法一样,我建议的基本方法也是确定React是否使用
console.error
来响应不可接受的测试属性值。具体来说,该方法涉及对每个测试属性值执行以下操作:console.error
**(以确保先前对console.error
的调用不干扰),console.error
是否按预期击发**。testPropTypes
函数**以下代码可以放在测试中,也可以作为单独的导入/必需模块/文件:
任何检查
propTypes
的测试都可以使用三个或四个参数****调用testPropTypes
**:component
,由 prop 修改的React组件;propName
,被测 prop 的字符串名称;arraysOfTestValues
,要测试的 prop 的所有期望测试值的阵列的阵列:otherProps
(可选),该对象包含此组件的任何其他必需属性的属性名称/值对。需要
otherProps
对象来确保React不会因为无意中丢失了其他必需的属性而对console.error
进行不相关的调用。只需为任何必需的属性包含一个可接受的值,例如{requiredPropName1: anyAcceptableValue, requiredPropName2: anyAcceptableValue}
。该函数执行以下操作:
console.error
**的模拟,React用它来报告不正确类型的 prop 。console.error
模拟,以便可以假定检测到的任何错误消息都来自此测试。请注意,将
null
赋值为(或undefined
)到一个prop值,从React的Angular 来看,本质上与不为该prop提供任何值是一样的。根据定义,这对于可选prop是可接受的,但对于必需prop是不可接受的。因此,* * 通过将null
放置在可接受或不可接受值的数组中,可以分别测试该属性是可选的还是必需的**。propTypes
):*目前,对于如何使用这种方法存在一些明显的限制,如果超出这些限制,可能会导致一些难以跟踪的测试错误。this other SO question/answer中解释了这些限制的原因和含义。总之,对于简单的prop类型,如
myProp1
,您可以测试任意多个不可接受的非null
测试prop值 *,只要它们都是不同的数据类型 *。对于某些复杂的prop类型,如myProp2
,您只能测试任何类型 * 的 * 单个 * 不可接受的非null
prop值 *。有关更深入的讨论,请参阅其他问题/答案。llew8vvj8#
模拟
console.error
不适合在单元测试中使用!@AndrewWillems链接到上面注解中的另一个SO问题,该注解描述了这种方法的问题。查看this issue on facebook/prop-types,了解该库抛出而不是记录propType错误的能力(在编写本文时,还不支持该功能)。
我已经发布了一个helper库check-prop-types来同时提供这种行为。