在这个简单的情况下,如何让我的单元测试彼此独立?

Sim*_* V. 6 c# tdd unit-testing

我正在使用测试驱动开发方法在C#中编写一个小游戏.我遇到了一个问题:

我有一节课CheckersBoard:

public class CheckersBoard
{
    private const string InitialBoardPattern = "B-B-B-B-" +
                                               "-B-B-B-B" +
                                               "B-B-B-B-" +
                                               "--------" +
                                               "--------" +
                                               "-W-W-W-W" +
                                               "W-W-W-W-" +
                                               "-W-W-W-W";

    public SquareStatus[,] Squares { get; private set; }

    public CheckersBoard(IBoardGenerator boardGenerator)
    {
        Squares = boardGenerator.GenerateFromPattern(InitialBoardPattern, 8, 8);
    }

    //....
}
Run Code Online (Sandbox Code Playgroud)

一节课BoardGenerator:

public class BoardGenerator : IBoardGenerator
{

    public SquareStatus[,] GenerateFromPattern(string pattern, int width, int height)
    {
        //....
    }

}
Run Code Online (Sandbox Code Playgroud)

BoardGenerator允许我以CheckersBoard一种非常易读的方式初始化.所以,我真的想BoardGenerator在我的单元测试中使用,以避免难看的数组初始化.

但这违反了规则,即我必须保持所有单元测试彼此独立.如果测试GenerateFromPattern失败,那将产生"级联"效果,并且所有使用的测试也GenerateFromPattern将失败.

这是我第一次使用单元测试,所以我有点困惑.我该如何避免这个问题?我的设计有问题吗?

k.m*_*k.m 2

显然这是一个没有明显答案的常见问题,我碰巧处理了两个类似的问题:

在某种程度上,重用业务逻辑(其他经过测试的组件)类似于在单元测试中使用第 3 方库 - 我们假设它们有效,并且不费心生成关于它们的额外断言。您是否会犹豫是否要使用List<T>单元测试?很可能不会。但请注意,List<T>许多其他开发人员每天都会对其进行测试,并且背后有大型软件公司支持。你能说同样的话BoardGenerator吗?

另一个需要考虑的问题是,CheckersBoard测试代码对于从未使用过的人来说是否会像BoardGenerator对您一样显而易见?您声称它是可读的,但考虑到作者的情况,这是很常见的。也许使用数组初始化并不像您想象的那么糟糕(不可读)。