いくつかのメンバを初期化するテストコードがありますが、最初は一度だけ行う必要があります。私はそのためにコンストラクタを使用する理由はここにある:Unit-Testを2回実行するコンストラクタ
[TestFixture]
public class MyTestClass
{
private readonly IUnitTestGeometryProvider m_GeometryProvider;
public MyTestClass()
{
// do some heavy init-op
}
private IEnumerable<TestCaseData> TestCases()
{
yield return new TestCaseData(this.m_GeometryProvider.GetPolyline())
.Throws(typeof(ArgumentException));
}
[TestCaseSource("TestCases")]
public double Check_GetReducedArea_For_Invalid_Arguments(IGeometry theGeom)
{
return theGeom.GetReducedArea();
}
}
私がテストを初期化するためのFixtureSetup
-attributeを使用するには、条約の知っている、例えばthis question on SOから。しかし、私は方法TestCases
がその属性でマークされたメソッドの前に実行されることに気づいたので、m_GeometryProvider
が今度はnull
であるので、異なるテストケースを評価するときにはNullReferenceException
に入ります。
私は自分のコードをデバッグし、コンストラクタにブレークポイントを設定しました。私は、テストが実行される前に2回実行されることに気付きました。私はすべてのテストケースがMyTestClass
という独自のインスタンスを持っていると仮定しましたが、3つの異なるテストケースがあり、2回実行されるコンストラクタはそれを説明しません。
初期設定が重いので、一度だけ実行したいと思います。これを保証する方法はありますか?私はstatic
のメンバーを避けたいのですが、すでにあるメンバーがいるので他のメンバーを大量に募集してくれることがよくあります。さらに私は、テストのinitが、クラスそのものではなく、私のMyTestClass
のインスタンスに固有であると考えています。
私はNUnit 2.5.10を使用しています。
初期化にコンストラクタを使用しないでください。 'TestFixtureSetup'属性はコンストラクタではなく、重い初期化に使用してください。テストごとに、初期化メソッドは 'SetUp'属性でマークされます。 BTW 2.5.10は非常に古いです。現在のバージョンは3.7 –
@ PanagiotisKanavos私はすでにこれが私にとってうまくいかない理由を説明しました。問題は、その属性を使って、マークされたメソッドがfar * after * tha 'TestCases'メソッドで実行され、後者がNREに実行されるということです。 – HimBromBeere
@ PanagiotisKanavos TestCasesがセットアップ前に実行されてからエラーが発生する –