0

OCaml のOUnitユニット テスト フレームワークを使用して、関数を評価した結果が指定された型のインスタンスであることをテストしたいと思います。

Python のPyTestでこのようなテストを定義するには、次のようにします。

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

このロジックはどのように OUnit に変換できますか? つまり、型メンバーシップのアサーションはどのように指定されるのでしょうか?

テスト対象の関数に適切な型シグネチャで注釈が付けられていると仮定すると、このテストは不要になる可能性があることは承知しています。

4

1 に答える 1

2

これは型チェッカーの仕事であり、コンパイル時 (静的時) に自動的に行われます。型チェッカー (つまり、コンパイラ) は、関数によって作成されるすべての値が同じ型を持ち、その型がコンパイル時に静的に定義されることを保証します。コンパイル中に型エラーが発生するため、異なる型の値を作成する関数をコンパイルすることはできません。これは、静的に型付けされたすべての言語の必須のプロパティです。たとえば、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))
于 2017-01-06T19:34:44.310 に答える