NUnitで遊んでみた
基本的な書き方
[Test]
public void Test()
{
Assert.That(1, Is.EqualTo(1));
}
カスタム制約
Is.EqualTo はNUnit標準で用意されている制約ですが、独自の制約を作成する事ができます。
public class CustomConstraint : Constraint
{
public CustomConstraint(object expected)
{
}
public override ConstraintResult ApplyTo<TActual>(TActual actual)
{
return new ConstraintResult(this, actual, ReferenceEquals(actual, Arguments[0]));
}
}
public class Is : NUnit.Framework.Is
{
public static CustomConstraint Custom(object expected)
{
return new CustomConstraint(expected);
}
}
NUnitのIsにCustomという拡張メソッドを追加できました。
Assert.That(1, Is.Custom(1));
NUnitのExpressionの拡張メソッドも可能です。
public static class CustomConstraintExtensions
{
public static CustomConstraint Custom(this ConstraintExpression expression, object expected)
{
var constraint = new CustomConstraint(expected);
expression.Append(constraint);
return constraint;
}
}
Assert.That(1, Is.All.Custom(1));
SetUpをテストケース毎に共通化
JUnitではEnclosedと同じような事がしたい場合は以下でできます。
public class Test
{
[SetUp]
public virtual void Setup()
{
Console.WriteLine("Test SetUp");
}
public class Test1 : Test
{
[Test]
public void Test()
{
Console.WriteLine("Test1 Test");
}
}
public class Test2 : Test
{
[SetUp]
public override void Setup()
{
Console.WriteLine("Test2 SetUp");
}
[Test]
public void Test()
{
Console.WriteLine("Test2 Test");
}
}
}
TestFixture
クラスにTestFixture属性をつけると、ユニットテストが記述されているとクラスと認識されます。
パラメーター化されていないTestFixture属性はオプションで、Test、TestCase、または TestCaseSource属性が少なくとも1つ含まれていれば、 ユニットテストが記述されているとクラスと認識されます。
こんな感じで使えるみたいです。
[TestFixture(1.0, 2)]
[TestFixture(3, 4.0)]
[TestFixture(5)]
public class DeduceTypeArgsFromArgs<T1, T2>
{
private readonly T1 t1;
private readonly T2 t2;
public DeduceTypeArgsFromArgs(T1 t1) : this(t1, default(T2)) { }
public DeduceTypeArgsFromArgs(T1 t1, T2 t2)
{
this.t1 = t1;
this.t2 = t2;
}
[TestCase(5, 7)]
public void TestMyArgTypes(T1 t1, T2 t2)
{
Assert.That(t1, Is.TypeOf<T1>());
Assert.That(t2, Is.TypeOf<T2>());
}
}
assume
public class Test
{
[Test]
public void AssumeTest1()
{
Assume.That(1, Is.EqualTo(1), "message");
Assert.Fail("この行は実行される");
}
[Test]
public void AssumeTest()
{
Assume.That(1, Is.EqualTo(2), "message");
Assert.Fail("この行は実行されない");
}
}
パラメータのクラス化
Parameterクラスを1つのオブジェクトにまとめたい場合、TestCaseSource属性を使用すると実現可能です。
public class Test
{
[TestCaseSource(typeof(ParameterFactory), "Parameters")]
public void TestMyArgTypes(Parameter param)
{
Assert.That(1, Is.EqualTo(1));
}
}
public class ParameterFactory
{
public static List<Parameter> Parameters()
{
return new List<Parameter>()
{
new Parameter { Value = 1 },
new Parameter { Value = 2 },
};
}
}
public class Parameter
{
public int Value { get; set; }
}
ディスカッション
コメント一覧
まだ、コメントがありません