如何在服务器上捕获React propTypes警告?

时间:2015-08-10 21:26:09

标签: reactjs react-proptypes

在服务器上呈现React组件时,所有propTypes警告消息都会降为常规输出或process.stdout。例如,这仅在终端或一般应用程序日志中可见:

Warning: Failed propType: Required prop `title` was not specified in `Page`.

有没有办法捕捉这些警告并将它们转换或将它们导入另一个方向?例如,我想将应用程序日志和React(作为模板引擎)日志分开。我该怎么办?

3 个答案:

答案 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甚至不应该进行那些检查,这就是你想要运行的真实应用程序。这些警告仅适用于在本地运行的开发人员。