Утверждение ошибки типа потока в модульных тестах - PullRequest
0 голосов
/ 14 сентября 2018

Мы используем Flow для статической проверки типов в JavaScript.Типы потока могут быть сложными, и у нас были проблемы, когда мы думали, что у нас есть хорошие средства защиты статического типа от уродливых объектов, но проблемы с аннотациями потока означали, что проверка типов на самом деле не улавливала проблемы.

Чтобы предотвратить эту проблемуЯ хотел бы написать основанные на типах «модульные тесты», которые могут статически утверждать наши предположения о защите типов.Это легко, если я хочу подтвердить «действительный» случай, используя утверждения типа :

type User = {|
    name: string
|};

const user = {name: "Bob"};
(user: User);

Это пройдет, если user является действительным User, и тип ошибкипроверьте, если это не так.

Однако, чтобы подтвердить фактическую проверку типов защиты, мы должны иметь возможность утверждать Flow errors .Например, допустим, я хотел убедиться, что это неверно:

const user = {name: "Bob", age: 40};

Я могу сделать тестовый проход с помощью

// $ExpectError
const user = {name: "Bob", age: 40};

, но не могу заставить его потерпеть неудачу с

// $ExpectError
const user = {name: "Bob"};

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

Опции, которые я рассмотрел:

  • Я мог бы потенциально запустить flow как внешний процесс для определенных файлов и затем утверждать, что он возвратил ошибку, но для этого потребуется один файлдля каждого теста
  • Я мог бы использовать flow-runtime для доступа к типам во время выполнения и использовать их в модульных тестах, но это не дает статических утверждений

Есть ли способ статически утверждать, что утверждение потока должно завершиться неудачей, и выдать ошибку, если это не так?

1 Ответ

0 голосов
/ 16 сентября 2018

Чтобы утверждать, что определенные строки кода в ваших модульных тестах должны вызывать ошибки потока, просто напишите комментарий подавления ошибок потока над этими строками, затем запустите flow check --max-warnings 0 для всей вашей папки модульных тестов (или всей вашей кодовой базы) и подтвердите, что команда имеет статус выхода 0 (без ошибок или предупреждений). Вам не нужно запускать команды для каждого файла модульного теста по отдельности.

Как сказано в документации для suppress_comment, Flow выдаст предупреждение, если вы напишите комментарий подавления, например // $FlowExpectError, над строкой, которая фактически не вызывает ошибку Flow.

Предполагая, что вы определили свой suppress_comment, чтобы понимать $FlowExpectError как комментарий подавления, вот как будут выглядеть ваши юнит-тесты:

// this type definition could be imported from another file
type User = {|
    name: string
|};

// Check that Flow doesn’t raise an error for correct usages
const user = {name: "Bob"};

// Check that Flow does raise an error for incorrect usages
// $FlowExpectError
const user = {name: "Bob", age: 40};

Если вы запустите flow check --max-warnings 0 в папке, содержащей этот файл, и команда успешно завершится, то ваши тесты для вашего типа User пройдены.

...