c# - 如何使用 TDD 测试没有 args 构造函数和 setter 的外观类?

标签 c# java unit-testing tdd

这个问题有点像 following topic 的延续。 (不过,您不需要阅读它)。这只是我用 TDD 实现的俄罗斯方 block 游戏。

所以问题是:我有一组验收测试。我在其中之一定义了以下测试:

[TestMethod]
public void I_Can_Query_Any_Piece_Of_The_Board_For_A_Color() {
    StandardTetris tetris = new StandardTetris();

    for (int y = 0; y < tetris.BoardSize.Height; ++y) {
        for (int x = 0; x < tetris.BoardSize.Width; ++x) {
            Color color = tetris.GetColorAt(x, y);

            Assert.IsTrue(
                color == Color.Cyan ||
                color == Color.Blue ||
                color == Color.Orange ||
                color == Color.Yellow ||
                color == Color.Green ||
                color == Color.Violet ||
                color == Color.Red
                );
        }
    }
}

这让我改变了 StandardTetris

上的方法
public Color GetColorAt(int x, int y)
{
    return Color.Black;
}

public Color GetColorAt(int x, int y)
{
    return Color.Orange;
}

我想做的下一个测试是将几个像素设置为某些颜色,然后检查它们是否确实在我放置它们的位置中具有该颜色(尽管,现在我想到了,不会是验收测试)。 我怎样才能做到这一点? StandardTetris 不为棋盘提供任何类型的 setter (不是它应该这样做的!),并且除了默认构造函数之外,我不想有任何其他构造函数。那我该如何 mock 它呢?

<小时/>

这是StandardTetris上的当前代码:

public class StandardTetris
{
    private static readonly int BOARD_WIDTH = 10;
    private static readonly int BOARD_HEIGHT = 22;

    private Size boardSize = new Size(BOARD_WIDTH, BOARD_HEIGHT);

    public Size BoardSize { get { return boardSize; } }

    public Color GetColorAt(int x, int y)
    {
        return Color.Orange;
    }
}

根据您的建议,我进行了以下测试:

    [TestMethod]
    public void Set_A_Blue_2x2_Square_On_Origin_And_Query_It_Sucessfully() {
        Board board = new Board();
        board.SetColorAt(0, 0, Color.Blue);
        board.SetColorAt(0, 1, Color.Blue);
        board.SetColorAt(1, 0, Color.Blue);
        board.SetColorAt(1, 1, Color.Blue);

        Tetris tetris = new Tetris(board);

        Assert.AreEqual(Color.Blue, tetris.GetColorAt(0, 0));
        Assert.AreEqual(Color.Blue, tetris.GetColorAt(1, 0));
        Assert.AreEqual(Color.Blue, tetris.GetColorAt(0, 1));
        Assert.AreEqual(Color.Blue, tetris.GetColorAt(1, 1));
    }

最佳答案

我看到两个选项:

  • 创建第二个构造函数,您可以在其中传递预先构造的信息。

  • 创建一个继承自 StandardTetris 的测试类 TestStandardTetris,其中唯一的区别是 TestStandardTetris 具有用于获取预定义的构造函数。构建的信息。

你的测试告诉你,你需要一种方法来设置状态,并且你说你不希望状态改变,因此缺少 setter ,所以只剩下设置状态的唯一地方是构造函数。

第一个选项将其打开到游戏的主 API。

第二个仅向测试开放,任何 future 使用您的 API 的人如果决定继承 StandardTetris,它也将允许您测试 StandardTetris 的功能,如果唯一的事情是更改是将构造函数添加到 TestStandardTetris

可能还有其他更好的方法可以做到这一点,所以请等待看看其他人是否能提出更好的答案。 :)

关于c# - 如何使用 TDD 测试没有 args 构造函数和 setter 的外观类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3328705/

相关文章:

c# - Enumerable.Cast<T> 是否复制对象?

python - 模块化固定装置时,PyTest 在具有多个测试文件的目录上失败

Python单元测试多线程

ruby-on-rails - 在编写单元/功能测试时考虑缓存

c# - 这两个 C# 语句有什么区别?

c# - 制作一个图标闪烁的wpf应用程序

c# - 调试 WP7 崩溃

java - 如何从 JTextField 获取类似于 Scanner.next() 的输入?

java - 谷歌日历 v3 Java API : Insert event

java - 在 Java 中创建 API/库的步骤