В Codecademy мы используем Karma + Jasmine для тестирования нашей кодовой базы React. Мы также используем PropTypes, чтобы задокументировать, какие свойства ожидает каждый компонент React.

Проблема: на самом деле мы не проверяли типы PropTypes, поэтому, несмотря на то, что мы старались поддерживать их в чистоте, предупреждения продолжали появляться:

PropTypes важны. Они являются частью того, как мы документируем наш код, а отсутствующие или недействительные реквизиты часто являются признаком скрытых ошибок.

Мы используем CircleCI для запуска наших тестов и отображения этой информации в Github. Если бы мы могли включить проверку свойств в наш набор тестов, это было бы идеально. Но похоже, что React не предоставляет никаких тестовых утилит для проверки свойств ...

Это не особенно элегантно, но наш подход шпионит за console.warn и ищет правильно отформатированные операторы журнала.

//react_warnings.js
export default {
  watchConsole() {
    spyOn(console, ‘warn’);
  },
  propWarnings() {
    let propWarnings = console.warn.calls.all().filter((c) => {
      return (c.args &&
      c.args.length > 0 &&
      /(Invalid prop|Failed propType)/.test(c.args[0]));
    });
    return propWarnings;
  }
}

Тогда тест может выглядеть примерно так:

import ReactWarnings from ‘test_helpers/react_warnings’;
describe('MyComponent', () => {
  beforeEach(ReactWarnings.watchConsole);
  it('renders without propWarnings', () => {
    TestUtils.renderIntoDocument(
      <MyComponent someProp="whatever"/>
    );
  });
  afterEach(() => {
    expect(ReactWarnings.propWarnings().length).toBe(0);
  });
});

Обратите внимание, что вы должны вызвать watchConsole перед рендерингом компонента, если вы хотите перехватывать предупреждения, связанные с рендерингом.

Короче говоря, это просто, и у нас это работает.

Если у вас есть другой подход к проверке PropTypes в React, я бы хотел это услышать!