OUnit: значение assert является экземпляром типа

Используя инфраструктуру модульного тестирования OUnit в OCaml, я хотел бы проверить, что результатом оценки функции является экземпляр указанного типа.

Определение такого теста в PyTest Python будет сделано следующим образом:

def test_foo():
    assert isinstance(foo(2), int)

Как эту логику можно перевести на OUnit? То есть, как определяются утверждения типа членства?

Мне известно, что при условии, что тестируемая функция снабжена соответствующей сигнатурой типа, это тестирование может быть ненужным.

1 ответ

Решение

Это работа средства проверки типов, которая выполняется автоматически во время компиляции (в статическое время). Проверка типов (т. Е. Компилятор) гарантирует, что все значения, созданные функцией, имеют одинаковый тип, а тип определяется статически во время компиляции. Вы не сможете скомпилировать функцию, которая создает значения разных типов, так как вы получите ошибку типа во время компиляции. Это существенное свойство всех статически типизированных языков, например, Java, C и C++ также имеют такое же свойство.

Так что, вероятно, вы используете запутанную терминологию. Возможно, в действительности вы пытаетесь проверить, что значение принадлежит конкретному варианту типа суммы. Например, если у вас есть тип суммы с именем numbers определяется как:

type t = 
  | Float of float
  | Int of int

и вы хотели бы проверить эту функцию truncate, определяется как

 let truncate = function
   | Float x -> Int (truncate x)
   | x -> x

всегда возвращает Int вариант, то вы можете сделать это следующим образом:

  let is_float = function Float _ -> true | _ -> false
  let is_int = function Int _ -> true | _ -> false

  assert (is_int (truncate 3.14))
Другие вопросы по тегам