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

How to catch React propTypes warnings on server?

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

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

有什么方法可以捕获此警告并将其转换或通过管道将其传送到另一个方向吗?例如,我想将应用程序日志和 React(作为模板引擎)日志分开。我该怎么做?

我试着查看 React src 是如何打印这些输出消息的,但后来我意识到它应该只在开发模式下打印这些消息。如果您的 node/iojs 运行时设置为 "production" env,React 甚至不应该进行这些检查,而这正是您想要的真实应用程序 运行。这些警告仅适用于本地开发人员 运行。

我需要同样的东西,但用于不同的用例。我想确保我所有的单元测试都在没有任何 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 来生成这些警告。

与@m01 一样,我想确保任何反应错误(实际上是任何 js 错误)都会导致我的单元测试失败,但我找到了一种更简单的方法来做到这一点。在你的测试的顶层,把这个:

beforeAll(() => {
  console.error = (error) => {
    throw new Error(error);
  };
});