我有一些测试代码正在初始化一些应该在开始时只做一次的成员。这就是为什么我用的构造:单元测试的构造函数运行两次
[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
在用该属性标记的方法之前执行,所以当评估不同的测试用例时碰到NullReferenceException
,因为m_GeometryProvider
目前为null
。
所以我调试了我的代码并在构造函数中设置了一个断点。我注意到,它在任何测试甚至运行之前执行了两次。我假定每个测试用例都有自己的MyTestClass
实例,但由于我有三个不同的测试用例,并且构造函数运行两次,所以这并不能解释它。
由于初始化很重,我只想执行一次。有没有办法保证这一点?我想避免一个static
成员,因为它经常吸引同事大量使用其他static
成员,因为已经有成员。此外,我认为test-init只针对我的MyTestClass
的一个实例,而不是类本身 - 假设只有一个实例。
我正在使用NUnit 2.5.10。
不要使用构造函数进行初始化。使用'TestFixtureSetup'属性进行大量初始化,而不是构造函数。每个测试初始化方法都用'SetUp'属性标记。 BTW 2.5.10很旧。目前的版本是3.7 –
@PanagiotisKanavos我已经解释了为什么这对我不起作用。问题在于,使用该属性后,标记为该方法的方法在* TestCases方法后运行很远,导致后者运行到NRE。 – HimBromBeere
@PanagiotisKanavos它会引发错误,因为TestCases在安装之前运行 –