NUnit 2.5 が便利すぎる

NUnit 2.5 RC - ZOETROPEの日記

これみてもらえればもうほとんど言うことって残ってないんですが・・・
一応、ちょっと補足的な情報を。

TestCase

元エントリでは引数が 3 つとなってますけど、3 つ以上も可能でした。

[TestFixture]
public class AttributeTestSample
{
    [TestCase(1, 2, 3, 6)]
    [TestCase(10, 20, 30, 60)]
    [TestCase(10, 10, 10, 30)]
    public void TestCaseSample(int x, int y, int z, int expected)
    {
        Assert.That(x + y + z, Is.EqualTo(expected));
    }
}

TestCaseSource との使い分けの指針としては、

  • コンパイル時定数以外を使うなら TestCaseSource
  • コンパイル時定数のみだが、指定するのがだるい場合 TestCaseSource
  • それ以外なら TestCase

でいいんじゃないだろうか?
例えば、

[TestCase("hoge,piyo,foo,bar", new string[] { "hoge", "piyo", "foo", "bar" })]
// 他にも色々と指定
public void test(string target, string[] expected)
{
    Assert.That(target.Split(',', Is.EqualTo(expected));
}

とするのはだるいので、

static object[] D(string target, params string[] expected)
{
    return new object[] { target, expected };
}

static object[] TestData =
{
    D("hoge,piyo,foo,bar", "hoge", "piyo", "foo", "bar"),
    // 他にも色々と指定
};

// Test属性は付けなくてもいいっぽい
// [Test, TestCaseSource("TestData")]
[TestCaseSource("TestData")]
public void test(string target, string[] expected)
{
    Assert.That(target.Split(',', Is.EqualTo(expected));
}

のようにするとか。

例外のテスト

Assert.That の第一引数をラムダ式にすればいい。

// なんか例外が起こるはず
Assert.That(() => target.Method(), Throws.Exception);

// HogeExceptionが発生するはず
Assert.That(() => target.Method(), Throws.Exception.TypeOf<HogeException>());

// HogeExceptionが発生し、メッセージは"hoge"のはず
Assert.That(
    () => target.Method(),
    Throws.Exception.TypeOf<HogeMethod>()
    .And
    .Message.EqualTo("hoge"));

便利だ・・・
これで自作ライブラリ周りのテストがかなりシンプルに書けた。