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 的使用。