xUnit:传递包含对静态字段的引用的对象作为理论
xUnit: Passing object containing reference to static fields as theory
我将测试返回二维数组中单元格的 von Neumann 邻居数组的函数。
单元格包含有关模拟的数据。
为了进行测试,我设置了新的 Cell[] 并填充了 Cell 实例。
测试应该检查函数返回的邻居是否与预期的实例相同,并且在数组中的顺序相同。
public class VonNeumanNeighbourhoodTest
{
private static Cell a,b,c,d,e,f,g,h,i ;
private static Cell[,] space;
public VonNeumanNeighborhoodTest() {
a = new Cell{ GrainMembership = new Grain(0, Color.Red) };
b = new Cell{ GrainMembership = new Grain(1, Color.Green) };
// And so on
i = new Cell{ GrainMembership = new Grain(8, Color.Azure) };
space = new Cell[3, 3]
{
{ a, b, c },
{ d, e, f },
{ g, h, i }
};
}
测试方法出现问题。 Cell[] expected
在调试中总是包含 {null, null, null, null} 而不是 eg.{b, f, h, d} 引用。
[Theory]
[ClassData(typeof(AbsorbingTestData))]
public void AbsorbingTest(int x, int y, Cell[] expected)
{
var neighbours = VonNeumanNeighbourhood.Neighbours(space , x, y, AbsorbingBoundary.BoundaryCondition);
for(int i = 0; i < 4; i++)
{
Assert.Same(neighbours[i], expected[i]);//Checking if neighbours and expected are this same instances
}
}
}
private class AbsorbingTestData : IEnumerable<object[]>
{
public IEnumerator<object[]> GetEnumerator()
{
yield return new object[] { 1, 1, new Cell[]{b, f, h, d} }; //e - center
yield return new object[] { 0, 0, new Cell[]{null, b, d, null} }; //a
//More cases
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
}
我尝试使用带有 [MemberData] 属性的类似代码,但结果相同。
我认为您运行遇到了初始化顺序问题。 Cell
实例 (private static Cell a,b,c,d,e,f,g,h,i;
) 是静态的,但由实例构造函数初始化。无法保证构造函数会在 xUnit 枚举测试用例之前 运行。
尝试用静态初始化程序 (static VonNeumanNeighborhoodTest()
) 替换实例构造函数 (public VonNeumanNeighborhoodTest()
)。不过要小心——使用静态初始化程序时,这些值不会在测试之间重新设置。您最好寻找一种方法来完全消除 static
的使用。
我将测试返回二维数组中单元格的 von Neumann 邻居数组的函数。 单元格包含有关模拟的数据。
为了进行测试,我设置了新的 Cell[] 并填充了 Cell 实例。 测试应该检查函数返回的邻居是否与预期的实例相同,并且在数组中的顺序相同。
public class VonNeumanNeighbourhoodTest
{
private static Cell a,b,c,d,e,f,g,h,i ;
private static Cell[,] space;
public VonNeumanNeighborhoodTest() {
a = new Cell{ GrainMembership = new Grain(0, Color.Red) };
b = new Cell{ GrainMembership = new Grain(1, Color.Green) };
// And so on
i = new Cell{ GrainMembership = new Grain(8, Color.Azure) };
space = new Cell[3, 3]
{
{ a, b, c },
{ d, e, f },
{ g, h, i }
};
}
测试方法出现问题。 Cell[] expected
在调试中总是包含 {null, null, null, null} 而不是 eg.{b, f, h, d} 引用。
[Theory]
[ClassData(typeof(AbsorbingTestData))]
public void AbsorbingTest(int x, int y, Cell[] expected)
{
var neighbours = VonNeumanNeighbourhood.Neighbours(space , x, y, AbsorbingBoundary.BoundaryCondition);
for(int i = 0; i < 4; i++)
{
Assert.Same(neighbours[i], expected[i]);//Checking if neighbours and expected are this same instances
}
}
}
private class AbsorbingTestData : IEnumerable<object[]>
{
public IEnumerator<object[]> GetEnumerator()
{
yield return new object[] { 1, 1, new Cell[]{b, f, h, d} }; //e - center
yield return new object[] { 0, 0, new Cell[]{null, b, d, null} }; //a
//More cases
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
}
我尝试使用带有 [MemberData] 属性的类似代码,但结果相同。
我认为您运行遇到了初始化顺序问题。 Cell
实例 (private static Cell a,b,c,d,e,f,g,h,i;
) 是静态的,但由实例构造函数初始化。无法保证构造函数会在 xUnit 枚举测试用例之前 运行。
尝试用静态初始化程序 (static VonNeumanNeighborhoodTest()
) 替换实例构造函数 (public VonNeumanNeighborhoodTest()
)。不过要小心——使用静态初始化程序时,这些值不会在测试之间重新设置。您最好寻找一种方法来完全消除 static
的使用。