コレクション
(サンプルコード:「その06_コレクション」クラス)
コレクションをテストするために、CollectionAssert
クラスが用意されています。例えば次のように、順序を含めて等しいかを検査するにはAreEqual()
メソッドを使います。
[Test] public void Test01_順序も含めて等しいか() { var 期待値 = new int[]{ 1, 2, 3, }; var 実際の値 = new int[] { 1, 2, 3, }; CollectionAssert.AreEqual(期待値, 実際の値); // 否定形もある CollectionAssert.AreNotEqual(new int[] { 1, 3, 2, }, 実際の値); //順序が違えば等しくない CollectionAssert.AreNotEqual(new int[] { 1, 2, }, 実際の値); //要素数が違っても等しくない }
他には次のようなアサーションがあります。
- 順序に関係なく等しいか:
AreEquivalent()
,AreNotEquivalent()
- 特定の要素を含んでいるか:
Contains()
,DoesNotContain()
,IsSubsetOf()
,IsNotSubsetOf()
- 空のコレクションか:
IsEmpty()
,IsNotEmpty()
- 要素にnullが入っていないか:
AllItemsAreNotNull()
- すべての要素が同じ型か:
AllItemsAreInstancesOfType()
- すべての要素がユニークか:
AllItemsAreUnique()
- 昇順に並んでいるか:
IsOrdered()
例外のテスト
(サンプルコード:「その07_例外」クラス)
例外が出ることをテストするには、try
~catch
する方法(サンプルコードを見てください)やExpectedException
属性を使う方法もありますが、今ではAssert.Throws()
を使うようになっています。
[Test] public void Test03_AssertThrowsを使う方法() { var ex = Assert.Throws<DivideByZeroException>(() => 例外.例外を送出するメソッド()); // Assert.Throws()は、発生した例外をそのまま返値にしてくれるので、
// 例外のメッセージやInnerExceptionを検査することも可能。 StringAssert.StartsWith("送出した例外", ex.Message); var innerEx = ex.InnerException; Assert.IsInstanceOf<NullReferenceException>(innerEx); StringAssert.StartsWith("内部で起きた", innerEx.Message); }
なお、指定した例外を継承している例外ならば何でも良い、というときにはAssert.Catch()
を使います。
新しい書き方 ~ Assert.That()
(サンプルコード:「その08_AssertThat」クラス)
これは、NUnit2.4から導入されたアサーションの新しい書き方で、Constraint-Based Assert Model(仮に「制約ベースのアサートモデル」と訳しておきます)と呼ばれます。次の4通りの書き方があります。
- 条件式:
Assert.That(条件式)
- オブジェクトと制約:
Assert.That(オブジェクト, 制約)
- オブジェクト(型指定付き)と制約:
Assert.That<T>(ref T型のオブジェクト, 制約)
- デリゲートと制約:
Assert.That(デリゲート, 制約)
条件式を与える書き方は簡単です。
[Test] public void Test01_条件式を与える() { var 期待値 = 3; var 実際の値 = 整数.加算する(1, 2); Assert.That(期待値 == 実際の値); }
制約は、Is
で始まります。
[Test] public void Test02_オブジェクトと制約を与える() { var 期待値 = 3; var 実際の値 = 整数.加算する(1, 2); Assert.That(実際の値, Is.EqualTo(期待値)); } [Test] public void Test04_ラムダ式と制約を与える() { var 期待値 = 3; Assert.That(() => 整数.加算する(1, 2), Is.EqualTo(期待値)); }
制約にはmodifier(修飾子)を付けられます。
[Test] public void Test05_EqualToのModifier() { // 文字列比較 Assert.That("aBc", Is.Not.EqualTo("ABC")); Assert.That("aBc", Is.EqualTo("ABC").IgnoreCase); Assert.That("aBc", Is.EqualTo("ABC").Using((IComparer)StringComparer.OrdinalIgnoreCase)); // 浮動小数点数 Assert.That(99.9, Is.Not.EqualTo(100.0)); Assert.That(99.9, Is.EqualTo(100.0).Within(1).Percent); // 1%の許容誤差 }
複数の制約を組み合わせることもできます。
[Test] public void Test06_制約を組み合わせる() { Assert.That("aBc", Has.Length.EqualTo(3) & Is.StringStarting("a") & Is.StringContaining("B")); }
ここで紹介できなかった制約や修飾子が、たくさんあります。詳しくは、サンプルコードやConstraint-Based Assert Modelを参照してください。