gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:31:13 26 4
gpt4 key购买 nike

这个问题有点像 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com