在服务器上呈现React组件时,所有propTypes警告消息都会降为常规输出或process.stdout
。例如,这仅在终端或一般应用程序日志中可见:
Warning: Failed propType: Required prop `title` was not specified in `Page`.
有没有办法捕捉这些警告并将它们转换或将它们导入另一个方向?例如,我想将应用程序日志和React(作为模板引擎)日志分开。我该怎么办?
答案 0 :(得分:7)
与@ m01一样,我想确保任何反应错误(实际上是任何js错误)都会导致我的单元测试失败,但我找到了一种更简单的方法。在测试的顶层,把它放在:
beforeAll(() => {
console.error = (error) => {
throw new Error(error);
};
});
答案 1 :(得分:3)
我需要相同的东西,但是对于不同的用例。我想确保我的所有单元测试都没有任何React警告。
我在我的测试工具中使用它:
expectNoConsoleErrors: function() {
var savedErrors;
beforeEach(function () {
savedErrors = [];
spyOn(console, 'error').and.callFake(function () {
var stack = new Error(_.map(arguments).join(' ')).stack;
// if you need workarounds for come components, put them here
savedErrors.push(stack);
});
});
afterEach(function () {
if (savedErrors.length > 0) {
fail(savedErrors.join('\n'));
}
});
},
然后在describe
块中我放
myTestUtils.expectNoConsoleErrors()
它就像一个魅力。
这不是很干净,因为它也会捕获到console.error
的所有其他调用,但我在测试期间不需要它们,所以这对我来说似乎没问题。
此外,当我有一些行为不当的组件产生不必要的警告时,例如react-input-autosize我可以使用以下方法忽略它:
// Workaround for https://github.com/JedWatson/react-select/issues/371
if (_.contains(stack, 'react-input-autosize')) {
return;
}
顺便说一下,请注意,在v0.14
之前,React正在使用console.warn
代替console.error
来生成这些警告。
答案 2 :(得分:1)
我试着查看React src如何打印这些输出消息,但后来我意识到应该只在开发模式下打印这些消息。如果你的node / iojs运行时被设置为“生产”环境,那么React甚至不应该进行那些检查,这就是你想要运行的真实应用程序。这些警告仅适用于在本地运行的开发人员。