Getting a Good Grasp of F# (仮)

関数型言語F#をもっと楽しみたい

F#のコードをユニットテストで検証する その6 (NUnit)

NUnit を使って例外送出のテストをしてみます。以下に示すコードでは DivideByZeroException が確実にスローされることを確認するテストを実行しています。

例外送出のユニットテストの例

  1. module UnitTestingSamples2
  2. open NUnit.Framework
  3. open System
  4.  
  5. [<Test>]
  6. let ``ゼロ除算例外のテスト 1``() =
  7.     let td = new TestDelegate(fun() -> 1 / 0 |> ignore)
  8.     let result =
  9.         Assert.Throws<DivideByZeroException>(td)
  10.     TestContext.Out.WriteLine(sprintf "結果は %A" result)
  11.  
  12. [<Test>]
  13. let ``ゼロ除算例外のテスト 2``() =
  14.     let result =
  15.         Assert.Throws<DivideByZeroException>(
  16.             fun() -> 1 / 0 |> ignore
  17.         )
  18.     TestContext.Out.WriteLine(sprintf "結果は %A" result)

この例では(動作が全く同じ)2つの例外送出のテスト関数が書いてあります。ゼロ除算をわざと行って例外送出を行っています。

5~10行目:``ゼロ除算例外のテスト 1`` では TestDelegate クラスとラムダ式を使って Assert.Throws へ引数として渡すオブジェクトを作っています。

12~18行目:``ゼロ除算例外のテスト 2`` では TestDelegate クラスを経由せず、Assert.Throws の引数として直接ラムダ式を記述していますが同じ動作が期待できます。

Assert.Throws メソッドには型パラメータとして(送出される予定の型である) DivideByZeroException クラスを与えます。

テストエクスプローラーによる実行結果

f:id:pongitsune:20161026195436p:plain

``ゼロ除算例外のテスト 1``  で Assert.Throws メソッドの返り値をテスト結果として出力するために10行目の TestContext.Out.WriteLine メソッドを使っています。

テストエクスプローラー内で「``ゼロ除算例外のテスト 1`` 」の項目を選んで「出力」の部分をクリックすると以下のような TestContext.Out.WriteLine メソッドによる出力を見ることが出来ます。

f:id:pongitsune:20161026200304p:plain