7

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

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

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

4

3 回答 3

7

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

beforeAll(() => {
  console.error = (error) => {
    throw new Error(error);
  };
});
于 2015-12-13T23:53:38.123 回答
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产生这些警告。

于 2015-08-31T13:10:37.840 回答
1

我尝试查看 React src 他们如何打印这些输出消息,但后来我意识到它应该只在开发模式下打印这些消息。如果你的 node/iojs 运行时设置为“生产”环境,那么 React 甚至不应该进行这些检查,而这正是你想要运行真正的应用程序所需要的。这些警告仅适用于在本地运行的开发人员。

于 2015-08-13T20:57:38.293 回答