代码之家  ›  专栏  ›  技术社区  ›  vtambourine

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

  •  7
  • vtambourine  · 技术社区  · 9 年前

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

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

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

    3 回复  |  直到 9 年前
        1
  •  7
  •   Cam Jackson    9 年前

    像@m01一样,我想确保任何react错误(事实上任何js错误)都会导致单元测试失败,但我找到了一种更简单的方法。在测试的最高级别,将以下内容放入:

    beforeAll(() => {
      console.error = (error) => {
        throw new Error(error);
      };
    });
    
        2
  •  3
  •   mik01aj    9 年前

    我需要相同的东西,但需要不同的用例。我想确保我的所有单元测试都通过,没有任何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 而不是 控制台错误 以产生这些警告。

        3
  •  1
  •   Bill D    9 年前

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