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

时间:2012-09-05 12:55:02

标签: c# unit-testing tdd

我正在使用测试驱动开发方法在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);
    }

    //....
}

课程BoardGenerator

public class BoardGenerator : IBoardGenerator
{

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

}

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

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

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

2 个答案:

答案 0 :(得分:2)

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

在某种程度上,重用业务逻辑(其他经过测试的组件)类似类似于在单元测试中使用第三方库 - 我们假设它们有效,并且不会产生额外的断言他们。你是否有任何犹豫在单元测试中使用List<T>?很可能没有。但请注意,List<T>每天都会被许多其他开发人员测试,并且背后有很多软件。您能对BoardGenerator说出同样的意见吗?

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

答案 1 :(得分:1)

你可以mock你的BoardGenerator课程,或者只是伪造实施,例如

internal class MockBoardGenerator : IBoardGenerator
{
    public SquareStatus[,] GenerateFromPattern(string pattern, int width, int height)
    {
        // return fixed test data
    }
}